POJ 1006 Biorhythms
首先我们要知道,任意两个峰值之间一定相距整数倍的周期。假设一年的第N天达到峰值,则下次达到峰值的时间为N+Tk(T是周期,k是任意正整数)。所以,三个峰值同时出现的那一天(S)应满足
S=N1+T1∗k1=N2+T2∗k2=N3+T3∗k3
可以考虑从结果逆推。根据上面的等式,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;
}