c++中大数的组合
Combinations of large number in c++
如何在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;
}
只要将分子的因数存入一个数组中,并在可能的情况下将分母的每个因数分开即可。最后取减少分子的乘积 mod 10^9.
这是您的特定示例的一些代码。你需要写一个gcd()函数。
int a[] = { 1000,999,...,501 }; // numerator factors
for (int b = 2; b <= 500; b++) {
int x = b;
for (int i = 0; i < 500; i++) {
int d = gcd(x, a[i]);
if (d > 1) {
x = x / d;
a[i] = a[i] / d;
if (x <= 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
如何在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;
}
只要将分子的因数存入一个数组中,并在可能的情况下将分母的每个因数分开即可。最后取减少分子的乘积 mod 10^9.
这是您的特定示例的一些代码。你需要写一个gcd()函数。
int a[] = { 1000,999,...,501 }; // numerator factors
for (int b = 2; b <= 500; b++) {
int x = b;
for (int i = 0; i < 500; i++) {
int d = gcd(x, a[i]);
if (d > 1) {
x = x / d;
a[i] = a[i] / d;
if (x <= 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