#include<stdio.h>
int main()
{
int a, b, c, d, e[3]={23*28, 23*33, 33*28}, f;
int i=1 , n, j;
scanf("%d", &n);
while(n)
{
j=0;
while (scanf("%d%d%d%d",&a, &b, &c, &d) && a!=-1 && b!=-1 && c != -1 && d !=-1 )
{
a = a>23 ? a%23 : a;
b = b>28 ? b%28 : b;
c = c>33 ? c%33 : c;
while(e[0] % 33 != 1 )
{
e[0] = (23 * 28) * i;
i +=1;
}
while((e[1]) % 28 != 1 )
{
e[1] = (23 * 33) * i;
i +=1;
}
while(e[2] % 23 != 1 )
{
e[2] = (33 * 28) * i;
i +=1;
}
f = (c*e[0] + b*e[1] + a*e[2]) - d ;
j+=1;
printf("Case %d: the next triple peak occurs in %d days.\n",j, f>0? f%(23*33*28) : (23*28*33-d));
}
n = n-1;
if(n!=0) printf("\n");
}
return 0;
}
附:题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=160
点击打开链接
此题是中国剩余定理的应用,按照本人一贯的“拿来主义”,中国剩余定理可以理解为这样:a mod c1 = r1; a mod c2 = r2; a mod c3 =r3; (c1*c2)*n1 mod c3 == 1; (c2*c3)*n2 mod c1 == 1; (c1*c2)*n3 mod c3 == 1; 那么 ( (c1*c2)*n1*r3 + (c2*c3)*n2*r1 + (c1*c3)*n3*r2 ) % HCF( c1, c2 ,c3) 即为满足条件的最小值(ps:HCF为最小公倍数)。
最后提交的数后PE了,原因是最后一个换行符被打印出来了,加个条件限制一下就可以了。
自己在oj上第一次通过数论题,good,不过数论知识还是很弱,以后得好好向人请教。