题意:有3个循环周期,周期天数分别为23、28、33。对于某一年,已知某年这3个周期的某一峰值分别是当年的第p、e、i天, 问从第d天开始到最近一个满足3个周期都达到峰值的日期还有多少天。
经典的中国剩余定理应用题目.
#include<bits/stdc++.h>
#define rep(i,a, b) for(int i=(a); i<(b); ++i)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
#define ll long long
#define de(a) cout<<#a<<" => " <<(a)<<endl
const int maxn = 1e6+5;
using namespace std;
void extend_Euclid(int a, int b, int &x, int &y){
if(b==0) {
x=1, y=0;
return ;
}
extend_Euclid(b, a%b, x, y);
int tmp = x;
x = y;
y = tmp-(a/b)*y;
return;
}
int CRT(int a[], int m[], int n){
int M=1;
int ans=0;
rep(i, 1, n+1) M*=m[i];
rep(i, 1, n+1){
int x, y;
int MI = M/m[i];
extend_Euclid(MI, m[i], x, y);
ans = (ans+MI*x*a[i]+M)%M;
}
return (ans+M)%M;
}
int a[10], m[10]={0, 23, 28, 33};
int main(){
//freopen("in.txt", "r", stdin);
int T;
scanf("%d", &T);
while(T--){
int d, cas=0;
while(~scanf("%d %d %d %d", &a[1], &a[2], &a[3], &d)){
if(a[1]==-1 && a[2]==-1 && a[3]==-1 && d==-1) break;
int ans= CRT(a, m, 3);
if(ans <= d) ans+=23*28*33;
printf("Case %d: the next triple peak occurs in %d days.\n", ++cas,ans-d);
}
}
return 0;
}