Link
Solve
突然看到一道数学题,就随手A了。
(Lucas)定理如下:
[C^m _n mod p = C^{m/p} _{n/p}*C^{m mod p} _{n mod p} mod p
]
证明自己去搜
用组合数合乘法逆元就可以了
Code
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int T,n,m,p;
LL Fc[100005];
inline int read(){
int ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();}
while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
LL Pow(LL a,LL b,LL p){
LL w=a,s=1;
while(b){
if(b&1)s=w*s%p;
w=w*w%p;
b>>=1;
}
return s;
}
LL C(LL n,LL m){
if(m>n)return 0;
return Fc[n]*Pow(Fc[m],p-2,p)%p*Pow(Fc[n-m],p-2,p)%p;
}
LL Lucas(LL n,LL m){
if(!m)return 1;
return C(n%p,m%p)*Lucas(n/p,m/p)%p;
}
int main(){
freopen("P3807.in","r",stdin);
freopen("P3807.out","w",stdout);
T=read();
while(T--){
n=read();m=read();p=read();
Fc[0]=1;
for(int i=1;i<=p;i++)Fc[i]=(Fc[i-1]*i)%p;
printf("%lld
",Lucas(n+m,n));
}
return 0;
}