i64 POW (i64 a,i64 b,i64 MoD) {i64 ans=1; while(b) {if(b&1) ans=ans*a%MoD; A=a*a%MoD; b>>=1; } returnans;} I64 POW (i64 a,i64 b) {i64 ans=1; while(b) {if(b&1) ans=ans*A; A=a*A; b>>=1; } returnans;} I64 exgcd (i64 a,i64 b,i64&x,i64 &y) {i64 t,d; if(!b) {x=1; Y=0; returnA; } d=EXGCD (b,a%b,x,y); T=x; X=y; Y=t-a/b*y; returnD;}BOOLModular (i64 a[],i64 m[],i64 k) {i64 d,t,c,x,y,i; for(i=2; i<=k;i++) {D=EXGCD (m[1],m[i],x,y); C=a[i]-a[1]; if(c%d)return false; T=m[i]/D; X= (c/d*x%t+t)%T; a[1]=m[1]*x+a[1]; m[1]=m[1]*m[i]/D; } return true;} I64 reverse (i64 a,i64 b) {i64 x, y; EXGCD (A,b,x,y); return(x%b+b)%b;} I64 C (i64 n,i64 m,i64 MoD) {if(m>n)return 0; i64 ans=1, I,a,b; for(i=1; i<=m;i++) {a= (n+1-I.)%MoD; b=reverse (i%mod,mod); Ans=ans*a%mod*b%MoD; } returnans;} I64 C1 (i64 n,i64 m,i64 MoD) {if(m==0)return 1; returnC (N%mod,m%mod,mod) *c1 (n/mod,m/mod,mod)%MoD;} I64 cal (i64 n,i64 p,i64 t) {if(!n)return 1; i64 x=pow (p,t), i,y=n/x,temp=1; for(i=1; i<=x;i++)if(i%p) temp=temp*i%x; i64 ans=POW (temp,y,x); for(i=y*x+1; i<=n;i++)if(i%p) ans=ans*i%x; returnAns*cal (n/p,p,t)%x;} I64 C2 (i64 n,i64 m,i64 p,i64 t) {i64 x=POW (p,t); i64 A,b,c,ap=0, bp=0, cp=0, temp; for(temp=n;temp;temp/=p) ap+=temp/p; for(temp=m;temp;temp/=p) bp+=temp/p; for(temp=n-m;temp;temp/=p) cp+=temp/p; AP=ap-bp-CP; i64 ans=POW (p,ap,x); A=cal (N,p,t); b=cal (M,p,t); C=cal (nm,p,t); Ans=ans*a%x*reverse (b,x)%x*reverse (c,x)%x; returnans;}//calculate C (n,m)%modi64 Lucas (i64 n,i64 m,i64 MoD) {i64 i,t,cnt=0; i64 a[205],m[205]; for(i=2; i*i<=mod;i++)if(mod%i==0) {T=0; while(mod%i==0) {T++; MoD/=i; } m[++cnt]=POW (i,t); if(t==1) a[cnt]=C1 (n,m,i); Elsea[cnt]=C2 (n,m,i,t); } if(mod>1) {m[++cnt]=MoD; A[CNT]=C1 (N,M,MOD); } modular (A,M,CNT); returna[1];}
Extended Lucas theorem