扫盲。今天做题才知道这玩意。。(那你之前是怎么算阶乘的哇。。只会暴力暴力暴力嘛。。。。)
阶乘逆元,原理是费马小定理,有些意思。
1 #include<cstdio> 2 typedef long long LL; 3 const LL MOD = 1e9 + 7; 4 LL fac[1000000+5]; //阶乘 5 LL inv[1000000+5]; //逆元 6 7 LL quickMod(LL a,LL b) 8 { 9 LL ans = 1; 10 while (b) 11 { 12 if (b&1) 13 ans = ans * a % MOD; 14 a = a*a % MOD; 15 b >>= 1; 16 } 17 return ans; 18 } 19 20 void getFac() 21 { 22 fac[0] = inv[0] = 1; 23 for (int i = 1 ; i <= 1000000 ; i++) 24 { 25 fac[i] = fac[i-1] * i % MOD; 26 inv[i] = quickMod(fac[i],MOD-2); //表示i的阶乘的逆元 27 } 28 } 29 LL getC(LL n,LL m) //C(n,m) = n!/((n-m)!*m!) % (1e9+7) 30 { 31 return fac[n] * inv[n-m] % MOD * inv[m] % MOD; 32 } 33 int main() 34 { 35 getFac(); 36 int n,m; 37 while (~scanf ("%d %d",&n,&m)) 38 printf ("%lld ",getC((LL)n,(LL)m)); 39 return 0; 40 }