注意到23,28,33互质,所以可以通过中国剩余定理很容易的求解。
#include <iostream>
#include <cstdio>
using namespace std;
const int period=21252;
const int m[3]={23,28,33};
int p[3],D;
void gcd(int a,int b,int& d,int& x,int& y)
{
if(!b){d=a;x=1;y=0;}
else
{
gcd(b,a%b,d,y,x);
y-=x*(a/b);
}
}
int main()
{
int kase=1;
while(cin>>p[0]>>p[1]>>p[2]>>D)
{
if(p[0]<0&&p[1]<0&&p[2]<0&&D<0) break;
for(int i=0;i<3;i++) p[i]%=m[i];
int ans=0,d,y;
for(int i=0;i<3;i++)
{
int w=period/m[i];
gcd(w,m[i],d,y,d);
ans=(ans+y*w*p[i])%period;
}
if(ans<=D) ans=ans-D+period;
else ans-=D;
cout<<"Case "<<kase++<<": the next triple peak occurs in "<<ans<<" days."<<endl;
}
return 0;
}