AcWing 886. 求组合数 II
原题链接
简单
作者:
minux
,
2020-04-30 19:36:34
,
所有人可见
,
阅读 614
使用分治法或者快速幂求$a^k mod P$
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+5;
const int P=1e9+7;
int fact[N], infact[N];
// 快速幂计算a^k%mod
int qmi(int a, int k, int mod){
int res=1;
while(k){
if(k&0x01) res=(LL)res*a;
a=(LL)a*a%mod;
k>>=1;
}
return res;
}
// 分治法求幂
int _pow(int a, int k, int mod){
if(!k) return 1;
LL res=_pow(a, k/2, mod);
res =res%mod*res%mod;
if(k&0x01) res*=a%mod;
return res%mod;
}
int main(){
fact[0]=infact[0]=1;
for(int i=1; i<N; ++i){
fact[i]=(LL)fact[i-1]*i%P;
infact[i]=(LL)infact[i-1]*_pow(i, P-2, P)%P; // 根据费马小定理求出乘法逆元
}
int n;
cin>>n;
while(n--){
int a, b;
cin>>a>>b;
cout<<(LL)fact[a]*infact[b]%P*infact[a-b]%P<<endl;
}
return 0;
}