Biorhythms POJ - 1006 (中國剩餘定理)
阿新 • • 發佈:2018-12-26
題意:已知一個人的身體,智力和情感的迴圈週期,然後給出一個人身體,智力和情感的開始值,最後再給出一個固定時間,問在下一次三個共同達到峰值的時間在這個固定時間多長時間後。
題解:中國剩餘定理板題,首先得了解拓展gcd,知道了這個後,再瞭解下求逆元傳送門,在看下百科上的解釋就懂了傳送門,然後直接套拓展gcd的板子即可(儘量自己打)。
附上程式碼:
#include<iostream> #include<cstdio> using namespace std; void ex_gcd(int a,int b,int &x,int &y) { if(b==0){ x=1; y=0; }else{ int x1,y1; ex_gcd(b,a%b,x1,y1); x=y1; y=(x1-(a/b)*y1); } return ; } int main() { int m[4]; m[1]=23;m[2]=28;m[3]=33; int M=1; for(int i=1;i<=3;i++){ M*=m[i]; } int ans[4]; for(int i=1;i<=3;i++){ int x1,y1; int mi=M/m[i]; ex_gcd(mi,m[i],x1,y1); while(x1<0){ x1+=m[i]; } ans[i]=mi*x1; } int a,b,c,d; int casen=0; while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF){ if(a==-1&&b==-1&&c==-1&&d==-1){ break; } casen++; int n=0; n=(ans[1]*a+ans[2]*b+ans[3]*c-d+M)%M; if(n==0){ printf("Case %d: the next triple peak occurs in %d days.\n",casen,M); }else{ printf("Case %d: the next triple peak occurs in %d days.\n",casen,n); } } return 0; }