有三个周期,分别为23,28,33天。一个周期中有一天为峰值。
给出三个峰值日期,和当前日期,求最少要经过多少天,三个峰值同时出现。
中国剩余定理模板题。
【代码】
#include <cstdio>
#include <iostream>
#include <algorithm>
#define N 2335
#define INF 0x7fffffff
using namespace std;
typedef long long ll;
ll read()
{
ll x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
int ans,M=1,st,Case;
int a[4],b[4]={0,23,28,33};
void Exgcd(int a,int b,int &x,int &y)
{
if(b) {
Exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
else x=1,y=0;
}
int CRT(int a[],int b[],int n)
{
int x,y,rtn=0;M=1;
for(int i=1;i<=n;i++) M*=b[i];
for(int i=1;i<=n;i++)
{
int mi=M/b[i];
Exgcd(mi,b[i],x,y);
rtn=(rtn+a[i]*mi*x)%M;
}
if(rtn<0) rtn+=M;
return rtn;
}
int main()
{
while(1)
{
for(int i=1;i<=3;i++) a[i]=read();
st=read();if(st==-1) break;
ans=CRT(a,b,3);
if(ans<=st) ans+=21252;
printf("Case %d: the next triple peak occurs in %d days.\n",++Case,ans-st);
}
return 0;
}