首页 > 代码库 > poj 1006 Biorhythms

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;}

 

poj 1006 Biorhythms