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。