[模板]Lucas(ex)
1 int c(int b,int t,int modd){ 2 return b<t?0:fac[b]*inv[fac[t]]%modd*inv[fac[b-t]]%modd; 3 } 4 int lucas(int b,int t,int modd){ 5 return t?c(b%modd,t%modd,modd)*lucas(b/modd,t/modd,modd)%modd:1; 6 }
1 int pow(int b,int t,int p,int ans=1){ 2 while(t){ 3 if(t&1)ans=ans*b%p; 4 b=b*b%p; 5 t/=2; 6 } 7 return ans; 8 } 9 int fac(int n,int p,int pt,int ans=1){ 10 if(!n)return 1; 11 for(int i=1;i<pt;++i)if(i%p)ans=ans*i%pt; 12 ans=pow(ans,n/pt,pt); 13 for(int i=1;i<=n%pt;++i)if(i%p)ans=ans*i%pt; 14 return ans*fac(n/p,p,pt)%pt; 15 } 16 void ex_gcd(int a,int b,int &x,int &y){ 17 if(!b){x=1;y=0;return;} 18 ex_gcd(b,a%b,x,y); 19 int res=x;x=y;y=res-a/b*y; 20 } 21 int inv(int n,int p){ 22 int x,y; 23 ex_gcd(n,p,x,y); 24 return (x%p+p)%p; 25 } 26 int c(int b,int t,int p,int pt){ 27 if(b<t)return 0;int cnt=0; 28 for(int i=b;i;i/=p)cnt+=i/p; 29 for(int i=t;i;i/=p)cnt-=i/p; 30 for(int i=b-t;i;i/=p)cnt-=i/p; 31 return fac(b,p,pt)*inv(fac(t,p,pt),pt)%pt*inv(fac(b-t,p,pt),pt)%pt*pow(p,cnt,pt)%pt; 32 } 33 int CRT(){ 34 int ans=0,x,y; 35 for(int i=1;i<=nom;++i){ 36 ex_gcd(prr/tim[i],tim[i],x,y); 37 x=(x%tim[i]+tim[i])%tim[i]; 38 ans=(ans+prr/tim[i]*aans[i]%prr*x%prr)%prr; 39 } 40 return ans; 41 } 42 int ex_lucas(){ 43 for(int i=1;i<=nop;++i){ 44 if(pr%p[i]==0)modd[++nom]=p[i],tim[nom]=1; 45 while(pr%p[i]==0)pr/=p[i],tim[nom]*=p[i]; 46 } 47 for(int ii=1;ii<=nom;++ii){ 48 aans[ii]=1; 49 for(int i=1;i<=m;++i)aans[ii]=(aans[ii]*c(lef[i],num[i],modd[ii],tim[ii]))%tim[ii];//,printf("%lld ",c(lef[i],num[i],modd[ii],tim[ii]));printf("%lld %lld %lld\n",modd[ii],tim[ii],aans[ii]); 50 } 51 return CRT(); 52 }
$Fate \ is \ Fake$