是否有 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)。很容易看出解决方案路径会收敛:我强烈建议,如果您攻击此解决方案,请记住您的结果(动态规划)以避免重复。
这让你感动吗?
我正在尝试解决以下问题https://open.kattis.com/problems/listgame2 并且我能够成功生成给定数字的所有质因数,但问题要求我只需要获取唯一数字列表。
例如- 1099511627776 = 2^40 但由于数字 2 重复了 40 次,问题是将 2^40 简化为 2*4*8* .... == 1099511627776 而不重复任何整数以得出乘积。
我在
上面的反例 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)。很容易看出解决方案路径会收敛:我强烈建议,如果您攻击此解决方案,请记住您的结果(动态规划)以避免重复。
这让你感动吗?