中国剩余定理模板poj1006
#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 20; ll exgcd(ll a, ll b, ll &x, ll &y) { if (b == 0) { x = 1; y = 0; return a; } ll r = exgcd(b, a % b, x, y); ll t = x; x = y; y = t - a / b * y; return r; } ll china_remainder(int a[], int w[], int n)//w存放除数,a存放余数 { ll M = 1, ans = 0, x, y; for (int i = 0; i < n; i++) M *= w[i]; for (int i = 0; i < n; i++) { ll m = M / w[i]; exgcd(m, w[i], x, y); ans = (ans + x * m * a[i]) % M; } return (ans % M + M) % M; } int main() { int T, m, a[maxn], w[maxn]; w[0] = 23; w[1] = 28; w[2] = 33; ll n = 3; int p, e, i, d, kase = 0; while (~scanf("%d %d %d %d", &p, &e, &i, &d)) { if (p == -1 && e == -1 && i == -1 && d == -1) break; a[0] = p; a[1] = e; a[2] = i; ll ans = china_remainder(a, w, n); ans -= d; int mod = w[0] * w[1] * w[2]; ans = (ans % mod + mod) % mod; if (ans == 0) ans = mod; printf("Case %d: the next triple peak occurs in %lld days.\n", ++kase, ans); } return 0; }