我是编程的新手,并且陷入了排列部分。我有代码,适用于存储在矩阵中的大数字组合,但我无法找到我应该更改的内容以获得结果。 我尝试了用于排列的递归方法,但无法实现快速结果。
这是我得到的组合代码应该是条件的变化,我应该在这里进行排列?
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]);
}
}
答案 0 :(得分:1)
可以从定义中轻松推导出排列的重复规则:
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];
}
请注意,排列的数量增长很快并且溢出了int
可用的存储空间:13P11例如已经超出了带有有符号的32位整数的范围。
答案 1 :(得分:0)
你可以使用以下伪代码来计算排列和组合,因为 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])