题意:
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;
}