POJ 1006 Biorhythms | 中国剩余定理
题目:
人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。
通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。
然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。
题解:中国剩余定理.参考了这篇博文.
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 int p,e,i,d,t=1,cnt,a[5],m[5]; 6 int exgcd(int a,int b,int &x,int &y) 7 { 8 if (b==0) return x=1,y=0,a; 9 int r=exgcd(b,a%b,y,x); 10 y-=(a/b)*x; 11 return r; 12 } 13 int CRT(int a[],int m[],int n) 14 { 15 int M=1; 16 int ans=0; 17 for (int i=1;i<=n;i++) 18 M*=m[i]; 19 for (int i=1;i<=n;i++) 20 { 21 int x,y; 22 int Mi=M/m[i]; 23 exgcd(Mi,m[i],x,y); 24 ans=(ans+Mi*x*a[i])%M; 25 } 26 if (ans<0) ans+=M; 27 return ans; 28 } 29 int main() 30 { 31 while (scanf("%d%d%d%d",&p,&e,&i,&d)!=EOF) 32 { 33 if (p==-1 && e==-1 && i==-1 && d==-1) 34 break; 35 a[1]=p; 36 a[2]=e; 37 a[3]=i; 38 m[1]=23; 39 m[2]=28; 40 m[3]=33; 41 int ans=CRT(a,m,3); 42 if (ans<=d) 43 ans+=21252; 44 printf("Case %d: the next triple peak occurs in %d days.\n",++cnt,ans-d); 45 } 46 return 0; 47 }