用lucas定理配合快速幂做,代码:
#include<iostream>
using namespace std;
#define ll long long
ll mod,t,m,n,i;
ll mod_pow(ll x,ll n,ll mod){ //快速幂
ll res=1;
while(n){
if(n&1)res=res*x%mod;
x=x*x%mod;
n>>=1;
}
return res;
}
ll C(ll n,ll m){ //这个函数应该不会有问题
ll ans=1,x=1,i; //阶乘初始化
for(i=2;i<=n;i++)
ans=ans*i%mod;
for(i=2;i<=m;i++)
x=x*i%mod;
ans=ans*mod_pow(x,mod-2,mod)%mod; //x^p-2求逆元
m=n-m;x=1;
for(i=2;i<=m;i++)
x=x*i%mod;
ans=ans*mod_pow(x,mod-2,mod)%mod;
return ans;
}
ll Lucas(ll a,ll b){
if(a<mod && b<mod)return C(a,b);
else return C(a%mod,b%mod)*Lucas(a/mod,b/mod);
}
int main(){
cin>>t;
while(t--){
cin>>n>>m>>mod;
cout<<Lucas(n+m,n)<<endl;
}
return 0;
}
但是这样子如果
n=18716, m=19718, p=5393, 答案是 0 但我输出 981
想了半天没想明白,求助大佬