您的位置:首页 > 其它

poj 1006 Biorhythms(中国剩余定理)

2015-01-04 20:19 387 查看
题意:

x === p ( mod 23 )

x === e ( mod 28 )

x === i ( mod 33 )

给p e i ,求x 。

解析:

23 28 33互素,所以用中国剩余定理做。

用之前的解同余方程组的方法也试了试,很恶心,样例里面有0 0 0 0 这样的输入,会爆除0错。

代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <map>
#include <climits>
#include <cassert>
#define LL long long

using namespace std;
const int inf = 0x3f3f3f3f;
const double eps = 1e-8;
const double pi = 4 * atan(1.0);
const double ee = exp(1.0);

const int maxn = 30 + 10;

void exgcd(int a, int b, int& d, int& x, int& y)
{
if (b == 0)
{
d = a;
x = 1;
y = 0;
}
else
{
exgcd(b, a % b, d, y, x);
y -= a / b * x;
}
}

int a[5], m[5], M;
int CRT(int r)
{
M = 1;
int res = 0;
for (int i = 1; i <= r; i++)
{
M *= m[i];
}
for (int i = 1; i <= r; i++)
{
int Mi = M / m[i];
int d, x, y;
exgcd(Mi, m[i], d, x, y);
res = (res + Mi * x * a[i]) % M;
}
if (res < 0)
res += M;
return res;
}

int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
int ca = 1;
int p, e, i, d;
while (scanf("%d%d%d%d", &p, &e, &i, &d) == 4)
{
if (p + d + i + d == -4)
break;
a[1] = p, a[2] = e, a[3] = i;
m[1] = 23, m[2] = 28, m[3] = 33;
int ans = CRT(3);
while (ans <= d)
ans += M;
printf("Case %d: the next triple peak occurs in %d days.\n", ca++, ans - d);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: