analysis
如果不考虑limit,那么这就是一道中国剩余定理裸题
但是若考虑的话,那么当求出来的解在limit下的时候,可以对其不断的加23×28×33=2125223\times 28\times33=2125223×28×33=21252,这样的话,这个值一定是解
code
#include<iostream>
#include<cstdio>
using namespace std;
#define loop(i,start,end) for(register int i=start;i<=end;++i)
#define anti_loop(i,start,end) for(register int i=start;i>=end;--i)
#define clean(arry,num) memset(arry,num,sizeof(arry))
#define ll long long
#define isdegit(a) ((a>='0'&&a<='9'))
#define re register
template<typename T>void read(T &x){
x=0;char r=getchar();T neg=1;
while(!isdegit(r)){if(r=='-')neg=-1;r=getchar();}
while(isdegit(r)){x=(x<<1)+(x<<3)+r-'0';r=getchar();}
x*=neg;
}
ll exgcd(ll a,ll b,ll &x,ll &y){
if(b==0){
x=1;y=0;
return a;
}
ll res=exgcd(b,a%b,x,y);
ll x1=x,y1=y;
x=y1;
y=x1-a/b*y1;
return res;
}
ll china(ll n,ll *a,ll *m){
ll M=1;
loop(j,1,n)
M*=m[j];
ll res=0;
loop(i,1,n){
ll ti=0,y=0;
exgcd((M)/m[i],m[i],ti,y);
ti=(m[i]+ti)%m[i];
res=(res+a[i]*(M)/m[i]*ti)%M;
}
return res;
}
ll A[10],M[10];
int main(){
#ifndef ONLINE_JUDGE
freopen("datain.txt","r",stdin);
#endif
int _p=0,_e=0,_i=0,_d=0,cnt=0;
M[1]=23,M[2]=28,M[3]=33;
while(scanf("%d%d%d%d",&_p,&_e,&_i,&_d),_p!=-1){
A[1]=_p;A[2]=_e;A[3]=_i;
ll res=china(3,A,M);
printf("Case %d: the next triple peak occurs in %lld days.\n",++cnt,((res>_d)?res-_d:21252-(_d-res)));
}
return 0;
}