1. 程式人生 > >階乘和階乘逆元

階乘和階乘逆元

get getc can sca urn oid i++ const con

掃盲。今天做題才知道這玩意。。(那你之前是怎麽算階乘的哇。。只會暴力暴力暴力嘛。。。。)

 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\n",getC((LL)n,(LL)m)); 39
return 0; 40 }

階乘和階乘逆元