模板
公式:Lucas(n,m)=C(n%p,m%p)*Lucas(n/p,m/p)
Lucas定理保证了求C时逆元存在
注意逆元存在条件
不会证明
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long Lint; const int maxn=200009; int T; int n,m,mm; Lint f[maxn]; Lint Ksm(Lint a,int p){ Lint ret=1; for(;p;p>>=1,a=a*a%mm){ if(p&1)ret=ret*a%mm; } return ret; } Lint Inv(Lint x){ return Ksm(x,mm-2); } Lint C(int n,int m){ if(m>n)return 0; return f[n]*Inv(f[m])*Inv(f[n-m])%mm; } Lint Lucas(int n,int m){ if(m==0)return 1; return C(n%mm,m%mm)*Lucas(n/mm,m/mm)%mm; } int main(){ scanf("%d",&T); while(T--){ scanf("%d%d%d",&n,&m,&mm); n=n+m; f[0]=1; for(int i=1;i<=n;++i)f[i]=f[i-1]*i%mm; printf("%lld\n",Lucas(n,m)); } return 0; }