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 
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一下就解决了