将有q个问题查询。在每个查询中,您将在整棵树中获得一个随机节点。树的每个节点都存储一些整数值。求解程序需要在以给定节点为根的子树中的任意两个节点中,给出最小的零个数,其后跟任意两个数的乘积。
我想在每个节点中存储2s和5s的倍数,并以自下而上的方式计算每个节点的最小零个数。
答案 0 :(得分:4)
有趣的问题以及您寻找2和5的倍数的直觉是非常正确的!尾随零的数量等于两个值中的较小者。因此,例如,124000
中的尾随零为3,因为124000 = 2^5 * 5^3 * 31
从中得出2^5
和5^3
,以及min(5, 3) = 3
。>
通过这种方式,问题可以重述为(我将其称为 P10 以供进一步参考):
在以下乘积中找到2或5的最小乘数 子树中以给定为根的任何两个节点中的任何两个数字 节点。
我准备了一个包含十个数字的示例:
让我们以分解形式写数字:
好!我们已将问题处理为更可行的形式,现在将其分解为更简单的形式。
首先,让我们集中讨论一个类似的简化问题,而无需考虑5:
在以下乘积中找到2的最小乘数 子树中以给定为根的任何两个节点中的任何两个数字 节点。
现在我们只关心二元,因此我们可以从图片中删除所有其他因素:
在此树中,在每个节点上,我们将从节点的子树中写下两个最低的数字,自下而上(如您建议的那样!)。在考虑节点时,我们已经为它的所有子节点确定了两个最低编号,因此足以遍历直属子节点来找到节点的两个最低编号:
简化的问题解决了!只需将一个节点中的数字相乘并返回指数:
现在,以上内容实际上非常接近解决实际问题( P10 )。用五个而不是两个重做简化版本:
在以下乘积中找到5的最小乘数 子树中以给定为根的任何两个节点中的任何两个数字 节点。
然后,对于任何节点 v , P10 的解决方案为 P10(v)= min(P2(v),P5(v))强>。
资源: