Biorhythms
题目链接
题目大意
题目给了三个周期,现在要求最近的一天同时%这3个周期等于p,e,i 。
题解
根据题意,现在有三个式子
X≡p(mod 23)X≡e(mod 28)X≡i(mod 33)
用中国剩余定理求一个最小的X即可。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int p,e,ii,d,T,m[3]={23,28,33},a[3];
int extend_gcd(int a,int b,int &x,int &y)
{
int t,ans;
if (b==0)
{
x=1; y=0;
return a;
}
else ans=extend_gcd(b,a%b,x,y);
t=x;
x=y;
y=t-(a/b)*y;
return ans;
}
int chinese_reminder()
{
int n=1,ans=0,x,y;
for (int i=0;i<3;i++) n*=m[i];
for (int i=0;i<3;i++)
{
extend_gcd(n/m[i],m[i],x,y);
ans+=(a[i]*x*(n/m[i]));
}
ans=(ans+n)%n;
return ans;
}
int main()
{
int ans;
scanf("%d",&T);
int Case=1;
while(scanf("%d%d%d%d",&a[0],&a[1],&a[2],&d),a[0]!=-1||a[1]!=-1||a[2]!=-1||d!=-1)
{
printf("Case %d: the next triple peak occurs in ",Case++);
ans=chinese_reminder();
if (d>=ans) printf("%d days.\n",21252-d+ans);
else printf("%d days.\n",ans-d);
}
return 0;
}