20pts,应该不是逆元出错,用了递推和费马小定理算逆元,结果都是一样。
谢谢大佬
#include<bits/stdc++.h>
#define int long long
using namespace std;
int d[100001];
inline int read(){
char c; int x=0,f=1; c=getchar();
while(c<'0'||c>'9'){ if(c=='-') f=-1; c=getchar(); }
while(c>='0'&&c<='9'){ x=(x<<3)+(x<<1)+(c^48); c=getchar(); }
return x*f;
}
inline int work(int a,int b,int p){
int ans=1;
while(b){
if(b%2==1){ ans=ans*a%p; b--; }
if(b%2==0){ b/=2; a=a*a%p; }
}
return ans;
}
inline int inv(int a,int b,int p){
return (a%p*work(b,p-2,p)%p)%p;
}
inline int C(int n,int m,int p){
if(m>n) return 0;
int result1=inv(d[n],d[m],p)%p;
int result2=inv(result1,d[n-m],p)%p;
return result2;
}
inline int Lucas(int n,int m,int p){
if(m==0) return 1;
if(m==1) return n;
return (Lucas(n/p,m/p,p))%p*(C(n%p,m%p,p))%p;
}
signed main()
{
int t=read();
while(t--){
int n=read(),m=read(),p=read();
d[1]=1;
for(int i=2;i<=p;i++){
d[i]=d[i-1]*i%p;
}
cout<<Lucas(n+m,n,p)<<"\n";
}
return 0;
}
```