如何计算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;
}
答案 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