理解TPRODUCT问题背后的数学算法

时间:2011-05-22 18:50:07

标签: algorithm math mathematical-optimization

我一直在尝试解决codechef问题:http://www.codechef.com/MAY11/problems/TPRODUCT/

他们在这里进行了赛后分析:http://www.codechef.com/wiki/may-2011-contest-problem-editorials

我需要一些帮助来理解那里讨论的逻辑: 他们正在讨论使用对数代替函数

Pi=max(Vi*PL, Vi*PR)

数学不是我强大的领域。 [我一直试图通过参加这样的比赛来提高]。如果有人能对这个问题给出一个非常愚蠢的解释,那对像我这样的凡人来说会有所帮助。感谢。

2 个答案:

答案 0 :(得分:2)

乘法的一个大问题是数字变得非常快,并且存在达到int或long的上限并且溢出到负数的问题。对数允许我们保持较小的计算,然后以模数形式得到答案。

在追溯通过动态编程找到的结果时,天真的解决方案是将所有值相乘,然后修改:

(x0 * x1 * x2 * ... * xk) (mod n)

这被一系列较小的计算所取代,这些计算避免了绑定溢出:

z1 = e^(log(x0) + log(x1)) modulo n
z2 = e^(log(x2) + log(z1)) modulo n
...
zk = e^(log(xk) + log(z{k-1})) modulo n

然后zk包含结果。

答案 1 :(得分:1)

据推测,他们依靠简单的数学观察,如果:

z = y * x

然后:

log(z) = log(y) + log(x)

因此将乘法转化为加法。