exlucas

i128 作为下标的时候会出现奇怪 ub!所以要先强转!

#include <bits/stdc++.h> #define int __int128 #define pb push_back //#define i64 long long //#define using namespace std; int rd() { int f=1,sum=0; char ch=getchar(); while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} while(isdigit(ch)) {sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();} return sum*f; } void pr(int x) { static int st[10000]; int tot=0; if(x<0) { putchar('-'); x=-x; } if(x==0) { putchar('0'); return ; } while(x) st[++tot]=x%10,x/=10; for(int i=tot;i>=1;i--) putchar(st[i]+'0'); } int n,m,P,pp[10000],A[10000],M[100000],mod,p,CT; int t; int fpow(int x,int y) { int res=1; x%=mod; while(y) { if(y&1) res=res*x%mod; y>>=1; x=x*x%mod; } return res; } int jie[5000005]; int sol(int n) { if(!n) return 1; if(n==1) return 1; int qwq=n/mod,res=sol(n/p); // pr(mod); putchar(' '); pr(n); putchar('\n'); res=res*fpow(jie[mod],qwq)%mod; // cout<<n<<" "<<mod<<'\n'; // for(int i=1;i<=n;i++) { // if(i%p) res=res*i%mod; // } for(int i=qwq*mod+1;i<=n;i++) { if(i%p) res=res*i%mod; } // for(int i=1;i<=n;i++) { // if(__gcd(i,p)==1) res=res*i%mod; // } return res; // int res=1; // for(int i=1;i<=n;i++) { // int x=i; // while(__gcd(x,p)!=1) x/=p; // res=res*x%mod; // }return res; } int vp(int n) { int res=0; for(int i=p;;i*=p) { // pr(p); putchar('\n'); if((n/i)==0) break ; res+=n/i; } return res; } //int baoli(int x) { // int res=1; // if(m<p) { // for(int i=n-m+1;i<=n;i++) res=res*i%mod; // for(int i=1;i<=m;i++) res=res*fpow(i,mod-2)%mod; // return res; // } // for(int i=m+1;i<=n;i++) res=res*i%mod; // for(int i=1;i<=n-m;i++) res=res*fpow(i,mod-2)%mod; // return res; //} pair<int,int>exgcd(int a,int b) { if(!b) { return make_pair(1,0); } auto qwq=exgcd(b,a%b); return make_pair(qwq.second,qwq.first-(a/b)*qwq.second); } int lcm(int x,int y) { return x/__gcd(x,y)*y; } int inv(int a) { auto qwq=exgcd(a,mod); return (qwq.first%mod+mod)%mod; } int get(int x) { mod=M[x]; p=pp[x]; jie[0]=1; for(int i=1;i<=mod;i++) { jie[i]=jie[i-1]; if(i%p!=0) jie[i]=jie[i]*i%mod; } // if(n<p||m<p||n-m<p) { // return baoli(x); // } int res=vp(n)-vp(m)-vp(n-m); res=fpow(p,res); res=res*sol(n)%mod*inv(sol(n-m))%mod*inv(sol(m))%mod; // cout<<res<<" "<<baoli(x)<<'\n'; // cout<<p<<" "<<mod<<" "<<res<<" "<<vp(n)-vp(m)-vp(n-m)<<'\n'; return res; } signed main() { // cin.tie(0); ios::sync_with_stdio(false); n=rd(); m=rd(); P=rd(); if(m>n) { cout<<"0"; return 0; } for(int i=2;i*i<=P;i++) { if(P%i) continue ; ++t; M[(short)t]=1; pp[(short)t]=i; while(P%i==0) M[t]*=i,P/=i; } if(P!=1) ++t,M[t]=P,pp[(short)t]=P; for(int i=1;i<=t;i++) { if(M[i]==0) { cout<<"wa"; } } for(int i=1;i<=t;i++) A[i]=get(i); if(t==1) { A[1]=(A[1]%M[1]+M[1])%M[1]; pr(A[1]); return 0; } int ans=A[1],MM=M[1]; for(int i=2;i<=t;i++) { // cout<<A[i]<<'\n'; int a=MM,b=M[i],C=(A[i]-ans%b+b)%b; int d=__gcd(a,b); // if(C%d) { // fl=0; break ; // } auto qwq=exgcd(MM,M[i]); int x=qwq.first; if(d==0) { cout<<"WA"; } x=x*(C/d)%(M[i]/d); int q=lcm(MM,b); ans=(ans+x*MM%q)%q; // MM=q;ans=(ans%MM+MM)%MM; } pr(ans); return 0; }

__EOF__

本文作者F x o r G
本文链接https://www.cnblogs.com/xugangfan/p/17067929.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   FxorG  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示