luogu简化了题意而且提供了翻译。
直接开做,这题可以选择使用CRT,我也使用了……但是其实似乎暴力也可以。
我们老套的CRT操作,这样每次对于输入的值直接乘一下就行。
注意特判的时候如果四个值都是0的话要输出0.
看一下代码(CRT的内容在代码里)
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<cmath> #include<set> #include<queue> #define pr pair<int,int> #define mp make_pair #define fi first #define sc second #define rep(i,a,n) for(int i = a;i <= n;i++) #define per(i,n,a) for(int i = n;i >= a;i--) #define enter putchar(' ') using namespace std; typedef long long ll; const int N = 200005; const int INF = 1000000009; int read() { int ans = 0,op = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { ans *= 10; ans += ch - '0'; ch = getchar(); } return ans * op; } int exgcd(int a,int b,int &x,int &y) { if(!b) { x = 1,y = 0; return a; } int d = exgcd(b,a%b,y,x); y -= a / b * x; return d; } int M1,M2,M3,x,y,e1,e2,e3,M,p,e,i,d,cur,tot; int main() { M1 = 28 * 33,M2 = 23 * 33,M3 = 23 * 28,M = 21252;//先构造 exgcd(M1,23,x,y),x = (x + 23) % 23,e1 = M1 * x; exgcd(M2,28,x,y),x = (x + 28) % 28,e2 = M2 * x; exgcd(M3,33,x,y),x = (x + 33) % 33,e3 = M3 * x;//求出mod每一个给定的数余1,剩下能整除的一组数 while(++tot) { p = read(),e = read(),i = read(),d = read(); if(p == -1 && e == -1 && i == -1 && d == -1) break; cur = p * e1 + e * e2 + i * e3,cur %= M;//解不定方程一样把这个解乘以本次输入的数再相加 cur -= d,cur = (cur+M) % M; if(d == 0 && cur == 0) cur = M; printf("Case %d: the next triple peak occurs in %d days. ",tot,cur); } return 0; }