POJ 1006 Biorhythms

来源:互联网 发布:手机自动充电软件 编辑:程序博客网 时间:2024/04/29 08:11

POJ 1006 Biorhythms

​ 首先我们要知道,任意两个峰值之间一定相距整数倍的周期。假设一年的第N天达到峰值,则下次达到峰值的时间为N+Tk(T是周期,k是任意正整数)。所以,三个峰值同时出现的那一天(S)应满足

S=N1+T1k1=N2+T2k2=N3+T3k3

可以考虑从结果逆推。根据上面的等式,S满足三个要求:除以T1余数为N1,除以T2余数为N2,除以T3余数为N3。这样我们就把问题转化为求一个最小数,该数除以T1余N1,除以T2余N2,除以T3余N3。这就是中国剩余定理。依据此,时间复杂度可达到O(1)。

#include<cstdio>  const int P=21252;int p,e,i,d,n,count=0;int main(){     while(scanf("%d%d%d%d",&p,&e,&i,&d)!=EOF)    {        count++;        if(p==-1&&e==-1&&i==-1&&d==-1)        {            break;        }        n=(5544*p+14421*e+1288*i-d)%P;          if(n<=0)        {            n+=21252;        }        printf("Case %d: the next triple peak occurs in %d days.\n",count,n);    }    return 0;}
原创粉丝点击