HIT暑期集訓 數論
阿新 • • 發佈:2020-08-26
中國剩餘定理,求解符合若干個x%a[i]≡b[i]的答案x(模板中求出的最小的非負整數解)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[3],b[3]={23,28,33}; void exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1;y=0; return; } exgcd(b,a%b,x,y);中國剩餘定理,模板題 POJ 1006int tmp=x; x=y; y=tmp-a/b*y; } int crt(int n) { int i,tmp,ans=0,lcm=1,x,y; for (i=0;i<n;++i) lcm*=b[i]; for (i=0;i<n;++i) { tmp=lcm/b[i]; exgcd(tmp,b[i],x,y); x=(x%b[i]+b[i])%b[i]; ans=(ans+tmp*x*a[i])%lcm; } return (ans+lcm)%lcm; } intmain() { int p,e,i,d; int cnt=0,ans; while (scanf("%d%d%d%d",&p,&e,&i,&d)!=EOF) { if (p==-1) break; a[0]=p; a[1]=e; a[2]=i; ans=crt(3); if (ans<=d) ans+=21252; cnt++; printf("Case %d: the next triple peak occurs in %d days.\n",cnt,ans-d); } return 0; }