https://vjudge.net/problem/POJ-1006
思路:中国剩余定理。
#include<cstdio>
using namespace std;
typedef long long ll;
ll a[3];
ll m[3]={23,28,33};
ll exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1,y=0;
return a;
}
ll c=exgcd(b,a%b,x,y);
ll t=x;
x=y,y=t-a/b*x;
return c;
}
ll inv(int a,int p)
{
ll x,y;
exgcd(a,p,x,y);
return (x%p+p)%p;
}
ll CRT()
{
ll ans=0,M=1;
for(int i=0;i<3;i++)
M*=m[i];
for(int i=0;i<3;i++)
{
ll tmp=M/m[i];
ans=(ans+a[i]*tmp*inv(tmp,m[i]))%M;
}
return (ans+M)%M;
}
int main()
{
ll cur;
int times=0;
while(~scanf("%lld%lld%lld%lld",&a[0],&a[1],&a[2],&cur))
{
if(a[0]==a[1]&&a[1]==a[2]&&a[2]==cur&&cur==-1)
break;
ll ans=CRT();
ll M=m[0]*m[1]*m[2];
while(ans<=cur)
ans+=M;
printf("Case %d: the next triple peak occurs in %lld days.\n",++times,ans-cur);
}
return 0;
}