有没有一种方法/算法可以从给定数字的素数中生成唯一的整数



我正试图解决以下问题https://open.kattis.com/problems/listgame2我能够成功地生成给定数字的所有素数,但问题要求我只需要得到一个唯一数字的列表。

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

我在Algorithm中发现了一个关于Stackoverflow的类似问题:对整数X进行因子分解,以获得尽可能多的不同正整数(Y1…Yk(,从而使(Y1+1((Y2+1(。。。(Yk+1(=X但是没有提供的逻辑

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

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

不要把这些看作是唯一的整数;把它们看作是权力的元组。你的第一个例子是2^40;您必须将CCD_ 1划分为尽可能多的不同整数。对于这个简单的例子,贪婪的方法使它变得微不足道:你获取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

给我们6个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个因子,而不是如果我们取11^1则为4x6(。

如果递归吸引了你,那么你可以写一个简单的递归例程,在N-dim空间的内壳中迭代,考虑到与已经消耗的点相邻的所有元组(包括不合格的原点(。每一个选择都会留下一个可分离、独立的子问题。顺便说一句,证明这个"内壳"足以找到最优解是微不足道的。

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


这能让你动起来吗?

最新更新