1. 程式人生 > 其它 >EOJ 3004 生理高峰 個人解題記錄

EOJ 3004 生理高峰 個人解題記錄

3004. 生理高峰

單點時限: 2.0 sec

記憶體限制: 256 MB

人生來就有三個生理週期,分別為體力、感情和智力週期,它們的週期長度為 23 天、28 天和 33 天。每一個週期中有一天是高峰。在高峰這天,人會在相應的方面表現出色。例如,智力週期的高峰,人會思維敏捷,精力容易高度集中。因為三個週期的周長不同,所以通常三個週期的高峰不會落在同一天。對於每個人,我們想知道何時三個高峰落在同一天。

對於每個週期,我們會給出從當前年份的第一天開始到出現高峰的天數(不一定是第一次高峰出現的時間)。你的任務是給定一個從當前年份第一天開始數的天數,輸出從給定時間開始(不包括給定時間)下一次三個高峰落在同一天的時間(距給定時間的天數)。例如:給定時間為 10,下次出現三個高峰同天的時間是 12,則輸出 2。

輸入格式

第 1 行:整數 T (1≤T≤10) 為問題數

對於每組測試資料:

每行輸入四個整數:p,e, i 和 d。p, e, i 分別表示體力、情感和智力高峰出現的時間(從當年的第一天開始計算)。d 是給定的時間,可能小於 p, e, 或 i。

所有給定時間是非負的並且小於 365, 所求的時間小於等於 21252(=23×28×33)。

輸出格式

對於每個問題,輸出一行問題的編號(格式:case #0: 等)。

然後在一行中輸出從給定時間起,下一次三個高峰同天的時間(距離給定時間的天數)。

樣例

input
3
0 0 0 100
4 5 6 7
283 102 23 320
output
case #0:
the next triple peak occurs in 21152 days.
case #1:
the next triple peak occurs in 16994 days.
case #2:
the next triple peak occurs in 8910 days.

 

 
#include <iostream>
using namespace std;
int day(long p, long e, long i, long d)
{
    int a;
    for (a = 0; a < 30000; a++)
    {
        if (a % 23 == p % 23 && a % 28 == e % 28 && a % 33 == i % 33 && a > d)
        {
            return a;
        }
    }
}
int main() { int t, ret = 0; long p, e, i, d; cin >> t; getchar(); while (t--) { cin >> p >> e >> i >> d; printf("case #%d:\nthe next triple peak occurs in %d days.\n", ret++, day(p, e, i, d) - d); } }//感謝評論區老哥提醒中國剩餘定理,直接mode一下就解決了