检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。
题面
题目描述
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为 天、 天和 天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为 ,下次出现三个高峰同天的时间是 ,则输出 (注意这里不是 )。
输入格式
输入四个整数:。
分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。 是给定的时间,可能小于 。 所有给定时间是非负的并且小于 ,所求的时间小于 。
当 时,输入数据结束。
输出格式
从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。
采用以下格式:
Case {}: the next triple peak occurs in {} days.
注意:即使结果是 天,也使用复数形式 days。
输入输出样例
样例输入 #1
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
样例输出 #1
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.
思路
设 表示三个峰值同时出现的那一天, 为周期,有:
显然需要求出 使 式成立,但题目只需要求出 的值,所以可以换一个角度入手。可以将 式转化为:
这样就可以使用中国剩余定理来解决问题了:
- 令 ,解得 ,则 。
- 令 ,解得 ,则 。
- 令 ,解得 ,则 。
故 ,则最终结果为 。
代码
#include <iostream>
using std::cin;
using std::cout;
const char endl = '\n';
int t, p, e, i, d;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
int lcm(int a, int b) {
return a / gcd(a, b) * b;
}
int main() {
std::ios::sync_with_stdio(false);
while (cin >> p >> e >> i >> d, ~p && ~e && ~i && ~d) {
int l = 21252,
ans = (5544 * p + 14421 * e + 1288 * i - d + l) % l;
cout << "Case " << ++t << ": the next triple peak occurs in " << (ans ? ans : l) << " days." << endl;
}
return 0;
}