UVA756 Biorhythms - 传送门
思路
直接来看,它就是一个中国剩余定理(CRT)。
但与【模板】中国剩余定理(CRT) 不同的是,它已经给出了所有的模数。
在 CRT 思想的基础上,我们可以求出每一个模数对应的正整数
a
a
a,使得(以第二个模数为例):
{
a
≡
0
(
m
o
d
23
)
a
≡
1
(
m
o
d
28
)
a
≡
0
(
m
o
d
33
)
\begin{cases}a\equiv{0}\pmod{23}\\a\equiv{1}\pmod{28}\\a\equiv{0}\pmod{33}\end{cases}
⎩⎪⎨⎪⎧a≡0(mod23)a≡1(mod28)a≡0(mod33)
此处可求出 a = 14421 a=14421 a=14421。
同理可求出剩下两个模数的 a a a 的值。
这样不难得出,题目中的 x x x 的值就是:
( 5544 × p + 14421 × e + 1288 × i ) m o d lcm ( 23 , 28 , 33 ) (5544 \times p + 14421 \times e + 1288 \times i)\ \bmod \operatorname{lcm}(23,28,33) (5544×p+14421×e+1288×i) modlcm(23,28,33)
最后我们再减去 d d d,取模就可以得出最终答案了。
注意取模时因避免出现负数,所以要先加上模数再取模。
代码
#include<bits/stdc++.h>
using namespace std;
const int lcm = 21252;//lcm (23, 28, 33) = 21252
int p, e, i, d;
int T;
inline void inpt ()
{
scanf ("%d %d %d %d", &p, &e, &i, &d);
}
int main ()
{
inpt ();
while (p != -1 and e != -1 and i != -1 and d != -1)
{
T += 1;
int ans = (5544 * p + 14421 * e + 1288 * i - d + lcm) % lcm;
if (ans == 0)
ans = lcm;
printf ("Case %d: the next triple peak occurs in %d days.\n", T, ans);
inpt ();
}
return 0;
}
感谢阅读。