我一直在尝试解决codechef问题:http://www.codechef.com/MAY11/problems/TPRODUCT/
他们在这里进行了赛后分析:http://www.codechef.com/wiki/may-2011-contest-problem-editorials
我需要一些帮助来理解那里讨论的逻辑: 他们正在讨论使用对数代替函数
Pi=max(Vi*PL, Vi*PR)
数学不是我强大的领域。 [我一直试图通过参加这样的比赛来提高]。如果有人能对这个问题给出一个非常愚蠢的解释,那对像我这样的凡人来说会有所帮助。感谢。
答案 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)
因此将乘法转化为加法。