POJ1006:Biorhythms——题解
http://poj.org/problem?id=1006
题目大意:
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。
中国剩余定理,具体是什么百度去。
#include<cstdio> #include<cctype> #include<iostream> using namespace std; int main(){ int r1,r2,r3,r; int i; for(i=1,r1=28*33;;i++) if(r1*i%23==1)break; r1*=i; for(i=1,r2=23*33;;i++) if(r2*i%28==1)break; r2*=i; for(i=1,r3=23*28;;i++) if(r3*i%33==1)break; r3*=i; r=23*28*33; int p,e,k; int cnt=0; while(cin>>p>>e>>i>>k){ if(p==e&&e==i&&i==k&&p==-1)return 0; cnt++; int sum=(r1*p+r2*e+r3*i-k)%r; sum=(sum+r-1)%r+1; printf("Case %d: the next triple peak occurs in %d days.\n",cnt,sum); } return 0; }