poj 1006 Biorhythms
题目:
http://poj.org/problem?id=1006
题意:
人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。
代码:
/* 中国剩余定理 */ #include<cstdio> using namespace std; int p,e,i,d,t,a[4],m[4],ans; void ty(int a,int b,int &x,int &y) { if(!b) { x=1; y=0; return ; } ty(b,a%b,x,y); int tmp=x; x=y; y=tmp-(a/b)*y; } int crt(int a[],int m[],int n) { int mm=1,tot=0,j,k; for(j=1;j<=n;j++) mm*=m[j]; for(j=1;j<=n;j++) { int x,y,mi=mm/m[j]; ty(mi,m[j],x,y); tot=(tot+mi*x*a[j])%mm; } if(tot<0) tot+=mm; return tot; } int main() { while(~scanf("%d%d%d%d",&p,&e,&i,&d)) { if(p==-1&&e==-1&&i==-1&&d==-1) break; a[1]=p; a[2]=e; a[3]=i; m[1]=23; m[2]=28; m[3]=33; ans=crt(a,m,3); if(ans<=d) ans+=21252; t++; printf("Case %d: the next triple peak occurs in %d days.\n",t,ans-d); } return 0; }