【发布时间】:2019-12-11 12:22:19
【问题描述】:
我正在尝试计算 nCr % M。所以我正在做的是
nCr = n!/(n-r)!*r! %M
换句话说,nCr = n! * (inverseFactorial(n-r)*inverseFactorial(r))。 所以我正在预先计算从 1 到 10^5 范围内的数字的阶乘和逆因子的值。 基本上,我正在尝试实现第一个答案。
https://www.quora.com/How-do-I-find-the-value-of-nCr-1000000007-for-the-large-number-n-n-10-6-in-C
这是我的代码。
//fill fact
fact[0]=1;
for(int i=1;i<100001;i++){
fact[i]=fact[i-1]*i%1000000007;
//fact[i]=fact[i]%1000000007;
}
//fill ifact - inverse of fact
ifact[0]=1;
for(int i=1;i<100001;i++){
ifact[i] = ifact[i-1]*inverse(i)%1000000007;
//ifact[i]=ifact[i]%1000000007;
}
方法是
public static long fastcomb(int n,int r){
long ans = ifact[r]*ifact[n-r];
System.out.println(ifact[r]);
System.out.println(ifact[n-r]);
ans = ans%1000000007;
ans=ans*fact[n];
System.out.println(fact[n]);
ans = ans%1000000007;
return ans;
}
public static int modul(int x){
x = x%1000000007;
if(x<0){
x+=1000000007;
}
return x;
}
public static int inverse(int x){
int mod = modul(x);
if(mod==1){
return 1;
}
return modul((-1000000007/mod)*(ifact[1000000007%mod]%1000000007));
}
我不确定我哪里出错了?请帮助我做错了什么,因为 ifact[2] 它向我显示 500000004。
【问题讨论】:
-
做同样的事情,但对于具有小素数的小 nCr 作为模数和调试!
-
注意
2 * 500000004 % p = 1,所以500000004是2的倒数。不是你要计算的吗?
标签: algorithm data-structures combinations modulo factorial