有多少n位数字与产品p

Flu*_*vid 4 algorithm combinatorics

我们应该使用什么算法来获得n位数的计数,使得其数字的乘积为p; 这里的特殊情况是没有数字应该是1;

到目前为止我所想的是对p进行素数分解.假设n = 3且p = 24.

我们首先进行24的素因数分解得到:2*2*2*3.

现在我有确定这些组合的问题

4*2*3,2*4*3,....等即使可以这样做...我将如何缩放为n小于素数的方式.

我不太确定这是否是正确的方向......欢迎提出任何意见.

ype*_*eᵀᴹ 5

首先,你真的不需要完全素数分解,只需要分解到比你的基数小的素数(我猜你的意思是10,但问题可以推广到任何基数).所以我们只需要分解为前4个素数:2,3,5和7.如果其余(素数或非素数)因子大于1,则问题有0个解.

现在,让我们假设这个数字p被考虑在内:

p = 2^d1 * 3^d2 * 5^d3 * 7^d4
Run Code Online (Sandbox Code Playgroud)

并且还由n数字组成:

p =d (n-1) d (n-2) ... d 2 d 1 d 0

然后,重新排列数字,也将是:

p = 2^q2 * 3^q3 * 4^q4 * 5^q3 * ... * 9^q9
Run Code Online (Sandbox Code Playgroud)

在哪里qi >= 0q2 + q3 + ... q9 = n

而且(由于因素分解):

for prime=2:  d1 = q2      + 2*q4      + q6      + 3*q8
for prime=3:  d2 =      q3             + q6             + 2*q9
for prime=5:  d3 =                  q5
for prime=7:  d4 =                            q7
Run Code Online (Sandbox Code Playgroud)

所以,q5q7是固定的,我们必须找到所有非负整数解的方程:
(其中未知数是休息qi:q2, q3, q4, q6, q8 and q9)

         d1 = q2      + 2*q4 + q6 + 3*q8
         d2 =      q3        + q6        + 2*q9
n - d3 - d4 = q2 + q3 +   q4 + q6 +   q8 +   q9
Run Code Online (Sandbox Code Playgroud)

对于上述每个解决方案,都有几个数字重新排列,可以通过以下公式找到:

X = n! / ( q2! * q3! * ... q9! )
Run Code Online (Sandbox Code Playgroud)

必须总结一下.

可能有一个封闭的公式,使用生成函数,您可以在Math.SE发布它


示例p=24,n=3:

p = 2^3 * 3^1 * 5^0 * 7^0
Run Code Online (Sandbox Code Playgroud)

我们有:

d1=3, d2=1, d3=0, d4=0
Run Code Online (Sandbox Code Playgroud)

整数解决方案:

3 = q2      + 2*q4 + q6 + 3*q8
1 =      q3        + q6        + 2*q9
3 = q2 + q3 +   q4 + q6 +   q8 +   q9
Run Code Online (Sandbox Code Playgroud)

(q2, q3, q4, q6, q8, q9) =:

(2, 0, 0, 1, 0, 0) 
(1, 1, 1, 0, 0, 0)
Run Code Online (Sandbox Code Playgroud)

给出:

3! / ( 2! * 1! )      = 3
3! / ( 1! * 1! * 1! ) = 6
Run Code Online (Sandbox Code Playgroud)

3+6 = 9整体解决方案.


示例p=3628800,n=10:

p = 2^8 * 3^4 * 5^1 * 7^1
Run Code Online (Sandbox Code Playgroud)

我们有:

d1=8, d2=4, d3=1, d4=1
Run Code Online (Sandbox Code Playgroud)

整数解决方案:

8 = q2      + 2*q4 + q6 + 3*q8
4 =      q3        + q6        + 2*q9
8 = q2 + q3 +   q4 + q6 +   q8 +   q9
Run Code Online (Sandbox Code Playgroud)

(q2, q3, q4, q6, q8, q9)(以及相应的数字和每个解决方案的重新排列):

(5, 0, 0, 0, 1, 2)    22222899 57    10! / (5! 2!)       =  15120
(4, 0, 2, 0, 0, 2)    22224499 57    10! / (4! 2! 2!)    =  37800
(4, 1, 0, 1, 1, 1)    22223689 57    10! / (4!)          = 151200
(3, 2, 1, 0, 1, 1)    22233489 57    10! / (3! 2!)       = 302400
(4, 0, 1, 2, 0, 1)    22224669 57    10! / (4! 2!)       =  75600
(3, 1, 2, 1, 0, 1)    22234469 57    10! / (3! 2!)       = 302400
(2, 2, 3, 0, 0, 1)    22334449 57    10! / (3! 2! 2!)    = 151200
(2, 4, 0, 0, 2, 0)    22333388 57    10! / (4! 2! 2!)    =  37800
(3, 2, 0, 2, 1, 0)    22233668 57    10! / (3! 2! 2!)    = 151200
(2, 3, 1, 1, 1, 0)    22333468 57    10! / (3! 2!)       = 302400
(1, 4, 2, 0, 1, 0)    23333448 57    10! / (4! 2!)       =  75600
(4, 0, 0, 4, 0, 0)    22226666 57    10! / (4! 4!)       =   6300
(3, 1, 1, 3, 0, 0)    22234666 57    10! / (3! 3!)       = 100800
(2, 2, 2, 2, 0, 0)    22334466 57    10! / (2! 2! 2! 2!) = 226800
(1, 3, 3, 1, 0, 0)    23334446 57    10! / (3! 3!)       = 100800
(0, 4, 4, 0, 0, 0)    33334444 57    10! / (4! 4!)       =   6300
Run Code Online (Sandbox Code Playgroud)

2043720如果我没有犯任何错误,这是完全解决方案..