http://poj.org/problem?id=1006
此题用到了中国剩余定理。
若某数x分别被d1、d2、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:
x=R1*r1+R2*r2+…+Rn*rn+R*D
其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;
R2…、Rn同理
D是d1、d2、…、的最小公倍数;
R是任意整数,可根据实际需要决定;
且d1、、…dn、必须互质,以保证每个Ri(i=1,2,…,n)都能求得.
代码如下:
#include <stdio.h> int main() { int p,e,i,d,days,r1,r2,r3,ca = 1; for(i = 1,r1 = 28*33;;i ++) if(r1*i % 23 == 1) break; r1 *= i; for(i = 1,r2 = 23*33;;i ++) if(r2*i % 28 == 1) break; r2 *= i; for(i = 1,r3 = 28*23;;i ++) if(r3*i % 33 == 1) break; r3 *= i; while(scanf("%d %d %d %d",&p,&e,&i,&d) == 4) { if(p ==-1 && e == -1 && i == -1 && d == -1) break; days = (r1*p + r2*e + r3*i - d + 21252)%21252; if(days == 0) days = 21252; printf("Case %d: the next triple peak occurs in %d days.\n",ca++,days); } return 0; }