EOJ 3004 生理高峰 個人解題記錄
阿新 • • 發佈:2022-03-15
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:
等)。
然後在一行中輸出從給定時間起,下一次三個高峰同天的時間(距離給定時間的天數)。
樣例
input3 0 0 0 100 4 5 6 7 283 102 23 320output
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一下就解決了