0
点赞
收藏
分享

微信扫一扫

UVA756 Biorhythms 题解

q松_松q 2022-03-19 阅读 36
c++

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} a0(mod23)a1(mod28)a0(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;
}

感谢阅读。

举报

相关推荐

0 条评论