[模板]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 }
Lucas
 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 }
ex_Lucas

 

posted @ 2019-07-07 07:20  DeepinC  阅读(105)  评论(0编辑  收藏  举报