传送门:点击打开链接
题意很好理解,值得注意的是:这是一个结果要求取模的题,因此按照中国剩余定理,结果唯一,需要取模,而这个取模很有讲究,一开始我wa的两次都是由于取模不当导致。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
int p, e, i, d;
int M, m1, m2, m3, t1, t2, t3;
void exgcd(int a, int b, int &x, int &y)
{
if(b == 0)
{
x = 1;
y = 0;
return;
}
exgcd(b, a % b, x, y);
int tmp = x;
x = y;
y = tmp - a / b * y;
}
int inverse(int a, int m)
{
int x, y;
exgcd(a, m, x, y);
return x;
}
void init()
{
M = 23 * 28 * 33;
m1 = M / 23; m2 = M / 28; m3 = M / 33;
t1 = inverse(m1, 23); t2 = inverse(m2, 28); t3 = inverse(m3, 33);
}
int sunzi()
{
int all = m1*t1*p+m2*t2*e+m3*t3*i;
return all - d;
}
int main()
{
int kase = 0;
init();
while(~scanf("%d%d%d%d", &p, &e, &i, &d))
{
if(p==-1&&e==-1&&i==-1&&d==-1)
break;
kase++;
int tmp = sunzi();
tmp %= M;
tmp = (tmp + M - 1) % M + 1;//这处是为了防止结果为负,之所以不tmp=(tmp+M)%M,是因为如果tmp=-M,那么tmp=0,错
printf("Case %d: the next triple peak occurs in %d days.\n", kase, tmp);
}
}