1. 程式人生 > >poj 1006中國剩餘定理的應用

poj 1006中國剩餘定理的應用

這道題主要講的是人有是哪個生理週期,分別是身體,情感和智力,這三個週期,他們的為其時間是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);//注意祥和裡就行了,其他的就都是模板了!
}
}