题意:
给定n和m,计算C(n,m)%10007
数据范围:n,m<=2e8
解法:
卢卡斯定理模板题
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=10007;
const int maxm=mod*2+5;
int fac[maxm];
int ppow(int a,int b,int mod){
int ans=1%mod;a%=mod;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int C(int n,int m){
if(m<0||m>n)return 0;
return fac[n]*ppow(fac[m]*fac[n-m]%mod,mod-2,mod)%mod;
}
int lucas(int n,int m){
if(m==0)return 1;
return C(n%mod,m%mod)*lucas(n/mod,m/mod)%mod;
}
signed main(){
fac[0]=1;
for(int i=1;i<maxm;i++)fac[i]=fac[i-1]*i%mod;
int T;cin>>T;
while(T--){
int n,m;cin>>n>>m;
int ans=lucas(n,m);
cout<<ans<<endl;
}
return 0;
}