Algorithm 给定一棵树,在一个特定节点的子树中找到两个值的乘积,使得乘积的零数最小?

Algorithm 给定一棵树,在一个特定节点的子树中找到两个值的乘积,使得乘积的零数最小?,algorithm,data-structures,tree,n-ary-tree,Algorithm,Data Structures,Tree,N Ary Tree,问题将有q查询。在每个查询中,将在整个树中为您提供一个随机节点。树的每个节点都存储一些整数值。解算器需要在给定节点的子树中的任意两个节点中,为任意两个数字的乘积提供最小数量的零 我想在每个节点中存储2和5的倍数,并以自底向上的方式计算每个节点的最小零数。有趣的问题和你寻找2和5的倍数的直觉是非常正确的!尾随零的数量等于两个值中的较小值。例如,124000中的尾随零的数量是三个,因为124000=2^5*5^3*31,我们从中得到2^5和5^3,以及min(5,3)=3 这样,问题可以重新表述为(

问题将有q查询。在每个查询中,将在整个树中为您提供一个随机节点。树的每个节点都存储一些整数值。解算器需要在给定节点的子树中的任意两个节点中,为任意两个数字的乘积提供最小数量的零


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

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

这样,问题可以重新表述为(我称之为P10,以供进一步参考):

P10: 求的乘积中2或5的最小多重数 子树中任意两个节点中的任意两个数字,根在给定的 节点


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

让我们以分解的形式写出这些数字:

好!!我们已经把这个问题处理成一个更可行的形式,现在我们将把它分解成更简单的形式


首先,让我们关注一个类似的简化问题,而不考虑五个方面:

P2: 求2的乘积的最小重数 子树中任意两个节点中的任意两个数字,根在给定的 节点

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

在这个树中,在每个节点上,我们将从节点的子树中写出两个最低的数字,从下到上(如您所建议的!)。当考虑一个节点时,我们已经为它的所有子节点确定了两个最低的数字,因此迭代直接子节点就足够找到一个节点的两个最低数字:

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


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

P5: 求5的乘积的最小重数 子树中任意两个节点中的任意两个数字,根在给定的 节点

然后,对于任何节点vP10的解是P10(v)=min(P2(v),P5(v))


资源:


问题是什么?你提出的算法有效吗?如果没有,你想让别人看一下吗(在这种情况下,你应该提供预期的测试用例结果、你的结果和你的算法)?我的算法正在处理面试官设计的测试用例。我想验证这个方法。我认为miloszlakomy已经给出了解决方法的清晰图像,