题目:https://www.acwing.com/problem/content/888/可能需要报课才能做
题解:求组合数的公式里面有个除法,除法是不能直接参与取模运算的,用求逆元的方法就可以了,时间复杂度n*log(n)
#include <iostream>
#include <string>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+7;
const int mod=1e9+7;
int fact[N],infact[N]; //fact阶乘,infact阶乘逆元
int qmi(int a,int k,int p){ //求逆元
int ans=1;
while(k){
if(k&1)ans=(ll)ans*a%mod;
a=(ll)a*a%mod;
k>>=1;
}
return ans;
}
int main()
{
fact[0]=infact[0]=1;
for(int i=1;i<N;i++){
fact[i]=(ll)fact[i-1]*i%mod;
infact[i]=qmi(fact[i],mod-2,mod)%mod; //求逆元
}
int n;
cin>>n;
while(n--){
int a,b;
cin>>a>>b; //除以一个数等于乘以这个数的逆元
cout<<(ll)fact[a]*infact[b]%mod*infact[a-b]%mod<<endl;
}
}