【中国剩余定理】 poj 1006
生理周期 简单模拟
对于超出23 * 28 * 33(21252)时进行求余运算即可。
#include<stdio.h> int main() { //freopen("in.txt","r",stdin); int a,b,c,d,s,m=1; while(scanf("%d %d %d %d",&a,&b,&c,&d),(a!=-1||b!=-1||c!=-1||d!=-1)) { s=a; if(b>s) s=b; if(c>s) s=c; do { s++; }while (((s+d-a)%23!=0)|| ((s+d-b))%28!=0 ||((s+d-c)%33!=0) ); if(s>21252) s=s%21252; printf("Case %d: the next triple peak occurs in %d days.\n",m,s); m++; } return 0; }
中国剩余定理
若某数x分别被d1、、…、dn除得的余数为r1、r2、…、rn,则可表示为下式:
x=R1r1+R2r2+…+Rnrn+RD
其中R1是d2、d3、…、dn的公倍数,而且被d1除,余数为1;
R1 、R2…、
Rn是d1、d2、…、dn-1的公倍数,而且被dn除,余数为1;
D是d1、d2、…、的最小公倍数;
R是任意整数,可根据实际需要决定;
且d1、、…、必须互质,以保证每个Ri(i=1,2,…,n)都能求得.
实际上POJ1006就是中国剩余定理的典型应用
根据上面的条件求出常数R1 = 5544,R2 = 14421,R3 = 1288,D = 21252
每次给的数据中的前三个值即相当于上面的余数。
则显然:
res = R1 * Physical + R2 * Emotion + R3 * Intelligence + RD - givenDate
并且0 =< res <= D
#include <stdio.h> int main() { int R1 = 5544, R2 = 14421, R3 = 1288, R = 21252; int ph, em, in, day; int res,i; for(i=1; 1; i++){ scanf("%d%d%d%d", &ph, &em, &in, &day); if(ph==-1)break; res = (R1 * ph + R2 * em + R3 * in - day) % R; res = (res + R - 1) % R + 1; //此步处理了负数和零的两种边界情况 printf("Case %d: the next triple peak occurs in %d days.\n", i, res); } return 0; }
提交结果:
模拟 782MS
中国剩余定理 32MS
太高端了!!!!!!