Biorhythms(POJ-1006)
Problem Description
人生來就有三個生理周期,分別為體力、感情和智力周期,它們的周期長度為23天、28天和33天。每一個周期中有一天是高峰。在高峰這天,人會在相應(yīng)的方面表現(xiàn)出色。例如,智力周期的高峰,人會思維敏捷,精力容易高度集中。因為三個周期的周長不同,所以通常三個周期的高峰不會落在同一天。對于每個人,我們想知道何時三個高峰落在同一天。對于每個周期,我們會給出從當(dāng)前年份的第一天開始,到出現(xiàn)高峰的天數(shù)(不一定是第一次高峰出現(xiàn)的時間)。你的任務(wù)是給定一個從當(dāng)年第一天開始數(shù)的天數(shù),輸出從給定時間開始(不包括給定時間)下一次三個高峰落在同一天的時間(距給定時間的天數(shù))。例如:給定時間為10,下次出現(xiàn)三個高峰同天的時間是12,則輸出2(注意這里不是3)。
Input
輸入四個整數(shù):p, e, i和d。 p, e, i分別表示體力、情感和智力高峰出現(xiàn)的時間(時間從當(dāng)年的第一天開始計算)。d 是給定的時間,可能小于p, e, 或 i。 所有給定時間是非負的并且小于365, 所求的時間小于21252。?
當(dāng)p = e = i = d = -1時,輸入數(shù)據(jù)結(jié)束。
Output
從給定時間起,下一次三個高峰同天的時間(距離給定時間的天數(shù))。
Sample Input
0 0 0 0
0 0 0 100
5 20 34 325
4 5 6 7
283 102 23 320
203 301 203 40
-1 -1 -1 -1
Sample Output
Case 1: the next triple peak occurs in 21252 days.
Case 2: the next triple peak occurs in 21152 days.
Case 3: the next triple peak occurs in 19575 days.
Case 4: the next triple peak occurs in 16994 days.
Case 5: the next triple peak occurs in 8910 days.
Case 6: the next triple peak occurs in 10789 days.
思路:
根據(jù)題意可知,一個周期內(nèi)有一天為峰值,即任意兩個峰值間隔著整數(shù)倍的周期。
假設(shè):一年的第 N 天到達峰值,周期是 T
則下一次到達峰值的時間為:
假設(shè)三個峰值同時出現(xiàn)的那天為 S
因此三個峰值同時出現(xiàn)的那天滿足:
其中,?為體力、情感、智力出現(xiàn)峰值的日期,?為體力、情感、智力的周期,因此僅需求三個非負整數(shù)??使得等式成立。
故問題可轉(zhuǎn)化為:S%23=P,S%28=E,S%33=I,P、E、I 為體力、情感、智力的出現(xiàn)的時間
由中國剩余定理可得以下同余方程組:
n1%(28*33)?= 0, n1%23 = P
n2%(23*33) = 0, n2%28 = E
n3%(23*28) = 0, n3%33 = I
解得 S = (n1+n2+n3)?% 21252
Source Program
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<set> #include<map> #include<stack> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 10001 #define MOD 123 #define E 1e-6 using namespace std; int main() {int p, e, i, d;int n=0;//計錄循環(huán)數(shù)的while(scanf("%d%d%d%d", &p, &e, &i, &d)!=EOF&&p>=0){int n1,n2,n3;/*求得每個周期內(nèi)的高峰在第幾天*/p=p%23+1;e=e%28+1;i=i%33+1;/*計算 n1%(28*33)?= 0, n1%23 = P*/for(int k=1;;k++){int m=(k*28*33)%23;if(p%m==0){n1=k*28*33*(p/m);break;}}/*n2%(23*33)=0,n2%28=E*/for(int k=1;;k++){int m=(k*23*33)%28;if(e%m==0){n2=k*23*33*(e/m);break;}}/*n3%(23*28)=0, n3%33=I*/for(int k=1;;k++){int m=(k*23*28)%33;if(i%m==0){n3=k*23*28*(i/m);break;}}int s=(n1+n2+n3-1)%21252;while(s-d<=0)s+=21252;printf("Case %d: the next triple peak occurs in %d days.\n",++n,s-d);}return 0; }?
總結(jié)
以上是生活随笔為你收集整理的Biorhythms(POJ-1006)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暑期训练日志----2018.8.11
- 下一篇: 菲波那契数列(信息学奥赛一本通-T118