poj 1006中國剩餘定理的應用 阿新 • • 發佈:2019-01-30 這道題主要講的是人有是哪個生理週期,分別是身體,情感和智力,這三個週期,他們的為其時間是23,28和33.已經知道這一年裡從第一天開始第一個生理週期出現的時間分別是P,e,i這三天,現在要求計算d天后多少天這三個週期同時出現?當然結果保證在21252天內的某一天出現,注意這裡是求d天后過多少天這些週期同時出現,是從d天后之後,還會過多少天,所以結果應該要減去d #include<iostream> #include<cstring> #include<cstdio> using namespace std; int m[4],M,a[4]; template <typename T> T exgcd(int a,int b,int &x,int &y) { if(!b){x=1;y=0;return a;} else { T d=exgcd<T>(b,a%b,y,x); y-=a/b*x; return d; } } //template<typename T> int china(int n)//只適用於針對那些模互質的情況 //在這裡就是指x=a[i]%m[i]中的m[i]分別互質 { int ans=0; M=1; for(int i=0;i<n;i++) M*=m[i]; int x,y,d; for(int i=0;i<n;i++) { int Mi=M/m[i]; d=exgcd<int>(Mi,m[i],x,y); ans=(ans+Mi*x*a[i])%M; } if(ans<0) ans+=M; return ans; } int main() { int d,time=1; while(~scanf("%d%d%d%d",&a[0],&a[1],&a[2],&d)) { if(a[0]==-1&&a[1]==-1&&a[2]==-1&&d==-1)break; m[0]=23;m[1]=28;m[2]=33; int ans=china(3); while(ans<=d)ans+=M; printf("Case %d: the next triple peak occurs in %d days.\n",time++,ans-d);//注意祥和裡就行了,其他的就都是模板了! } }