c ++中大量的组合

时间:2015-01-24 14:37:30

标签: c++ combinations

如何计算c ++中的大数组合? (例如,nCr n = 1000且r = 500)要求是组合的最后9位数。我尝试使用long long int变量,但我的代码仍然可以解决并显示50C19的最后9位但不超过它。

const long int a = 1000000000;
long long int ncr(int n,int r)  
{
 long long int fac1 = 1,fac2=1,fac;
 for(int i=r;i>=1;i--,n--)
    {
        fac1 = fac1 * n;
        if(fac1%i==0)
            fac1 = fac1/i;
        else
            fac2 = fac2 * i;
    }
 fac = fac1/fac2;
 return fac%a;
} 

1 个答案:

答案 0 :(得分:2)

只需将分子的因子存储在一个数组中,并在可能的情况下将分母的每个因子分开。最后得到减数分子mod 10 ^ 9的乘积。

以下是您的具体示例的一些代码。你需要编写一个gcd()函数。

int a[] = { 1000,999,...,501 }; // numerator factors

for (int b = 2; b <= 500; b++) {
  for (int i = 0; i < 500; i++) {
    int d = gcd(b, a[i]);
    if (d > 1) {
      b = b / d;
      a[i] = a[i] / d;
      if (b <= 1) break;
    }
  }
}

// take the product of a[] mod 10^9

int ans = 1;
for (int i = 0; i < 500; i++) {
  ans = (ans * a[i]) % 1000000000;
}
// ans = C(1000,500) mod 10^9

这里有一个关于其他技术的很好的讨论:

http://discuss.codechef.com/questions/3869/best-known-algos-for-calculating-ncr-m