是否有 method/Algorithm 从给定数字的质因数生成唯一整数?

Is there a method/Algorithm to generate unique integers from prime factors of a given number?

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

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

我在 上的 Whosebug 上发现了一个类似的问题 但是没有提供逻辑

上面的反例 link 是数字 10307264 = 2^6 * 11^5 这可能会减少到 2 * 4 * 11* 22 * 44 * 121 == 10307264

我不寻求解决方案,而是针对具体逻辑进行讨论以找到最佳解决方案。 提前致谢!

不要再将它们视为唯一的整数;将它们视为权力的元组。你的第一个例子是 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 space 中的格子。从靠近原点开始,我们通过格子向外工作,每次都消耗成本最低的点。 "Least-cost" 是留给我们最大选择范围的选择。我将对轴进行编号并按顺序标记选项:

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

"least-cost"有多种工作方式:消耗的因子最少(即元组总和最低),剩余的幂乘积最大(即我们先取 2^1,因为这样还剩下 5x5 个因子,而不是4x6 如果我们取 11^1).

如果递归对您有吸引力,那么您可以编写一个简单的递归例程,遍历 N-dim space 的内部 shell,考虑所有与点相邻的元组已经消费(包括不合格的产地)。每个选择都会留下一个可分离的、独立的子问题。顺便说一句,证明这个 "inner shell" 足以找到最佳解决方案是微不足道的。

例如,在上面的(6 5)例子中,要尝试的两个inner-shell点是(1 0)和(0 1),留下(5 5)和(5 5)的子问题(6 4)。很容易看出解决方案路径会收敛:我强烈建议,如果您攻击此解决方案,请记住您的结果(动态规划)以避免重复。


这让你感动吗?