http://poj.org/problem?id=1006
根据题意很自然地写出了暴破解法如下:
//POJ_1006 #include<stdio.h> int main(){ int n,i,j,k; int p,q,r,d; n = 0; while(true){ scanf("%d %d %d %d",&p,&q,&r,&d); if(p==-1 && q==-1 && r==-1 && d==-1){ break; } n++; for(i=p;;i+=23){ for(j=q;j<=i;j+=28){ for(k=r;k<=j;k+=33){ if(k==j&&j==i){ goto l1; } } } } l1: if(d>=i){ i+=21252; } printf("Case %d: the next triple peak occurs in %d days.\n",n,i-d); } return 0; }
但是太慢了,TLE
网上搜了下,根据中国剩余定理可以使效率得到很好的提升
https://blog.csdn.net/blogdevteam/article/details/102485483
//POJ_1006 //https://blog.csdn.net/qq_40379678/article/details/79034011 //中国剩余定理 /* a%b=c ==> (a+kb)%b=c a%b=c ==> (a*k)%b=kc */ /* S = p+23a = q+28b = r+33c 23*28 = 644 23*33 = 759 28*33 = 924 23*28*33 = 21252 */ #include<stdio.h> int main(){ int n,i,j,k; int p,q,r,d; int p1,q1,r1; int S; n = 0; while(true){ scanf("%d %d %d %d",&p,&q,&r,&d); if(p==-1 && q==-1 && r==-1 && d==-1){ break; } n++; p1 = p%23; for(i=924;;i+=924){ if(i%23==1){ break; } } i = i*p1; q1 = q%28; for(j=759;;j+=759){ if(j%28==1){ break; } } j = j*q1; r1 = r%33; for(k=644;;k+=644){ if(k%33==1){ break; } } k = k*r1; S = (i+j+k)%21252; if(S<=d){ S = S+21252; } printf("Case %d: the next triple peak occurs in %d days.\n",n,S-d); } return 0; }
————————————————
版权声明:本文为CSDN博主「abc827300139」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ABC827300139/article/details/102490609