C++ 大数置换nPr的最佳程序
我对编程还不熟悉,而且一直停留在排列部分。我有一个代码,它可以处理存储在矩阵中的大量数字的组合,但我无法找到我应该在其中修改什么才能得到结果。 我尝试了排列的递归方法,但没有得到快速的结果 这是我为组合得到的代码,条件的变化是什么,我应该在这里得到排列C++ 大数置换nPr的最佳程序,c++,c,algorithm,math,permutation,C++,C,Algorithm,Math,Permutation,我对编程还不熟悉,而且一直停留在排列部分。我有一个代码,它可以处理存储在矩阵中的大量数字的组合,但我无法找到我应该在其中修改什么才能得到结果。 我尝试了排列的递归方法,但没有得到快速的结果 这是我为组合得到的代码,条件的变化是什么,我应该在这里得到排列 void combination() { int i,j; for(i=0;i<100;i++) { nCr[i][0]=1; nCr[i][i]=1; } for(i=1;i<1
void combination()
{
int i,j;
for(i=0;i<100;i++)
{
nCr[i][0]=1;
nCr[i][i]=1;
}
for(i=1;i<100;i++)
for(j=1;j<100;j++)
if (i!=j)
{
nCr[i][j] = (nCr[i-1][j] + nCr[i-1][j-1]);
}
}
void组合()
{
int i,j;
对于(i=0;i而言,排列的递归规则可以很容易地从定义中推导出来:
nPk = n*(n-1)*(n-2)* ... * (n-k+1) = n * (n-1)P(k-1)
转换为代码:
for(i=0;i<100;i++)
{
nPr[i][0]=1;
}
for(i=1;i<100;i++)
for(j=1;j<100;j++)
if (i!=j)
{
nPr[i][j] = i * nPr[i-1][j-1];
}
for(i=0;i如果mod总是一个非常大的素数,那么您可以使用以下伪代码来计算置换和组合
置换nPr
func permutation(r,n,mod):
q=factorial(n) // you should precompute them and saved in an array for a better execution time
r=(factorial(r))%mod
return (q*math.pow(r,mod-2))%mod
对于组合nCr
func combination(r,n,mod):
q=factorial(n)
r=(factorial(r)*factorial(n-r))%mod
return (q*math.pow(r,mod-2))%mod
您应该预先计算阶乘,以获得适当的执行时间
fact[100000]
fact[0]=fact[1]=1
func factorial_compute():
for x from 2 to 100000:
fact[x]=(x*fact[x-1])%mod
因此,您的阶乘函数将是
func factorial(x):
return(fact[x])
关于这方面的数学参考:你想计算什么?我关于这方面的数学有点生疏,但如果你正在寻找nCr,那不是吗?nCr[n][r]
其中n
和r
是您要查找的值。如果您能提供大数置换nPr的确切定义,以明确说明您的程序正试图执行的操作。我会将我的答案降级为注释:在任何情况下,nPk(n,k)或nCk(n,k),该函数仅为0@Aki,我们谈论的是置换,而不是组合。13P11是3.113.510.400>2^31。