是否有一种方法/算法可以根据给定数的素数生成唯一整数?

我正在尝试解决以下问题https://open.kattis.com/problems/listgame2 并且我能够成功生成给定数字的所有素因子,但是问题要求我只需要获取唯一数字列表即可。

例如- 1099511627776 = 2 ^ 40 但是由于数字2重复了40次,所以问题在于将2 ^ 40简化为2 * 4 * 8 * .... == 1099511627776,而无需重复任何整数即可得出乘积。

我在Algorithm: Factorize a integer X to get as many distinct positive integers(Y1...Yk) as possible so that (Y1+1)(Y2+1)...(Yk+1) = X的Stackoverflow上发现了类似的问题 但没有提供逻辑

上述链接的一个反例是数字10307264 = 2 ^ 6 * 11 ^ 5,该数字可能应减少为2 * 4 * 11 * 22 * 44 * 121 == 10307264

我不是在寻找解决方案,而是在讨论寻找最佳解决方案的具体逻辑。 提前致谢!

esh2007 回答:是否有一种方法/算法可以根据给定数的素数生成唯一整数?

不要将它们视为唯一的整数;认为他们是权力元组。您的第一个示例是2 ^ 40;您必须将40划分为尽可能多的不同整数。对于这个简单的示例,贪婪的方法使其变得微不足道:先抓取1,再抓取2,...,直到剩下的数字足够大以至于无法分离而不会踩到先前的数字。这是三角形数字的简单应用:

`1 2 3 4 5 6 7 8`,and a remainder of 4

...,您可以根据需要在较高的数字之间进行分配(不重复);您将获得8个不同的整数作为分数。例如:1 2 3 4 6 7 8 9是您可能想要的2的幂。

对于一个复数,例如2 ^ 6 11 ^ 5,您现在有一对(6,5)可以划分为不同的对。现在,只要没有对完全为0,就可以有0个分量。给定的5点解决方案是次优的;链接的问题给出6,由功率对表示

1 0
2 0
0 1
0 2
1 1
2 1

给我们六个2和5 11。

这是多维解决方案派上用场的地方。给定的解决方案是由2和11的可用小因子(再次是贪婪)的乘积形成的:

{0 1 2} x {0 1 2}

...在每个关口采取成本最低的选择。可以将其想象为2D空间中的晶格。从原点附近开始,我们通过网格向外工作,每次消耗最少的成本。 “最低成本”是使我们拥有最大选择范围的选择。我将为轴编号并按顺序标记选择:

11 \ 2  0  1  2
  0        A  C
  1     B  E  F  
  2     D

有多种方法可以以“最低成本”工作:消耗的因素最少(即最低的元组总和),剩余的幂乘积最大(即,我们首先采用2 ^ 1,因为这留下了5x5的因素,而不是4x6的因素)我们采取了11 ^ 1)。

如果递归对您有吸引力,那么您可以编写一个简单的递归例程,该例程在N-dim空间的内壳中进行迭代,并考虑与已消耗点(包括不合格原点)相邻的所有元组。每个选择都会留下一个单独的,独立的子问题。顺便说一句,证明这种“内壳”足以找到最佳解决方案很简单。

例如,在上面的(6 5)示例中,要尝试的两个内壳点是(1 0)和(0 1),留下了(5 5)和(6 4)的子问题。很容易看到解决方案的路径会收敛:我强烈建议,如果您攻击此解决方案,则应记住结果(动态编程)以避免重复。


这会让你动起来吗?

本文链接:https://www.f2er.com/3093504.html

大家都在问