生理周期 简单模拟
对于超出23 * 28 * 33(21252)时进行求余运算即可。
#includeint 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#includeint 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
太高端了!!!!!!