您的位置:首页 > 其它

POJ 1006 中国剩余定理

2013-09-14 19:57 239 查看
这里写的是我(一个超级菜逼)的理解

题意就是这样

( num + d ) % 23 == p;

( num + d ) % 28 == e;

( num + d ) % 33 == i;

其中d, p, e, i都是已知的

23, 28, 33都是互质的数

后面的这是重点

33 * 28 * a % 23 = 1  => a = 6; 33 * 28 * a = 5544;

23 * 33 * b % 28 = 1  => b = 19; 23 * 33 * b = 14421;

23 * 28 * c % 33 = 1  => c = 2; 23 * 28 * c = 1288;

得 num + d = 5544 * p + 14421 * e + 1288 * i;

为什么要余1?为什么最后num + d能这么表达?

我们把num + d先代入( num + d ) % 23 = p中

可以看到后面的两个14421 * e + 1288 * i都被消去(因为都有个因数是23)

而5544mod23 = 1,故(num + d) % 23 = p;

其他的两个同理

固有如下代码

#include <cstdio>
#define MOD 21252
int p, e, i, d;
int main()
{
int it = 0;
while(scanf("%d%d%d%d", &p, &e, &i, &d)
!= EOF)
{
if(p == -1 && e == -1 && i == -1 && d == -1) break;
int ans = (5544 * p + 14421 * e + 1288 * i - d + MOD) % MOD;
if(ans <= 0) ans += MOD;
printf("Case %d: the next triple peak occurs in %d days.\n", ++it, ans);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: