给定一棵树,请在以特定节点为根的子树中找到两个值的乘积,以使乘积的最小数目为零?

时间:2019-05-16 05:19:11

标签: algorithm data-structures tree n-ary-tree

将有q个问题查询。在每个查询中,您将在整棵树中获得一个随机节点。树的每个节点都存储一些整数值。求解程序需要在以给定节点为根的子树中的任意两个节点中,给出最小的零个数,其后跟任意两个数的乘积。

我想在每个节点中存储2s和5s的倍数,并以自下而上的方式计算每个节点的最小零个数。

1 个答案:

答案 0 :(得分:4)

有趣的问题以及您寻找2和5的倍数的直觉是非常正确的!尾随零的数量等于两个值中的较小者。因此,例如,124000中的尾随零为3,因为124000 = 2^5 * 5^3 * 31从中得出2^55^3,以及min(5, 3) = 3

通过这种方式,问题可以重述为(我将其称为 P10 以供进一步参考):

P10:

  

在以下乘积中找到2或5的最小乘数   子树中以给定为根的任何两个节点中的任何两个数字   节点。


我准备了一个包含十个数字的示例:

an example with ten numbers

让我们以分解形式写数字:

numbers in their factorized form

好!我们已将问题处理为更可行的形式,现在将其分解为更简单的形式。


首先,让我们集中讨论一个类似的简化问题,而无需考虑5:

P2:

  

在以下乘积中找到2的最小乘数   子树中以给定为根的任何两个节点中的任何两个数字   节点。

现在我们只关心二元,因此我们可以从图片中删除所有其他因素:

only twos

在此树中,在每个节点上,我们将从节点的子树中写下两个最低的数字,自下而上(如您建议的那样!)。在考虑节点时,我们已经为它的所有子节点确定了两个最低编号,因此足以遍历直属子节点来找到节点的两个最低编号:

two lowest numbers on every node

简化的问题解决了!只需将一个节点中的数字相乘并返回指数:

solution to the simplified problem


现在,以上内容实际上非常接近解决实际问题( P10 )。用五个而不是两个重做简化版本:

P5:

  

在以下乘积中找到5的最小乘数   子树中以给定为根的任何两个节点中的任何两个数字   节点。

然后,对于任何节点 v P10 的解决方案为 P10(v)= min(P2(v),P5(v))


资源: