我试图想出一种有效的方法来列出一个大阶乘的所有除数。比方说1000!用蛮力是完全不可能的。有没有有效的方法?我需要处理它们,即找到它们的总和以应对编程挑战。
问问题
2297 次
2 回答
2
- 找到每个数字 <= 1000 的素数分解。我会将其存储为素数 -> 幂的字典。例如,对于像 24 这样的单个数字,
{2: 3, 3: 1}
因为 24 是2**3 * 3**1
。 - 求 的素因数分解
1000!
。这是数字 <= 1000 的字典的组合,通过对每个键(素数)的所有值求和来组合。 - 然后,您可以使用此页面上的公式 14,正如 @AakashM 已经说过的那样。
于 2012-08-02T12:59:34.533 回答
0
以下是有效解决方案的步骤:
嗯!可以表示为:- n! = (a1^p1) (a2^p2)x...(ak^pk)。
其中 ak 是小于 n 的素数除数,而 pk 是可以除 n! 的最高幂。
通过筛子找到素数和最高幂可以很容易地找到:
countofpower = [n/a] + [n/a^2] + [n/a^3] +...... or ` while (n) { n/ = a; ans += n }
因素计数 =
(ans1 +1)*(ans2 +1)*....(ansk +1)
在计算这最后一步之后是总和:
SUM = product of all (pow(ak,pk+1)-1)/(ak-1); ex = 4! 4! = 2^3 * 3^1; count of factors = (3+1)*(1+1) = 8 (1,2,3,4,6,8,12,24) sum = ( 1 + 2 + 4 + 8)*(1 + 3) = 60.
于 2018-07-11T18:58:25.820 回答