您的位置:首页 > 其它

POJ 1006 Biorhythms .

2016-08-07 17:04 330 查看
裸的中国剩余定理

求三个数的周期就是求他们的最小倍数

而且这三个数正好互素,所以肯定是中国剩余定理

#include<iostream>
using namespace std;
int gcdEx(int a,int b,int& x,int& y)
{ //求ax+by=gcd(a,b) 的整数解 返回gcd(a,b);
if(b==0) {
x=1; y=0; return a;
}
int x1,y1;
int gcd=gcdEx(b,a%b,x1,y1);
x=y1;
y=x1-a/b*y1;
return gcd;
}
int n0;
int CRT(int* a,int* n,int k)
{ //a[i]表示第i个余数,n[i]表示第i个除数,一共有k个数,返回x值
n0=1;
for(int i=0;i<k;i++) n0*=n[i]; //n0=n1*n2....*nk;
int ans=0,x,y,m;
for(int i=0;i<k;i++)
{
m=n0/n[i];
gcdEx(m,n[i],x,y);
ans=(ans+a[i]*x*m)%n0;
}
if(ans<0) ans+=n0;
return ans;
}
int main()
{
int a[3],day,kase=0;
int n[3]={23,28,33};
while(cin>>a[0]>>a[1]>>a[2]>>day&&a[0]!=-1)
{
int ans=CRT(a,n,3)-day;
if(ans<=0) ans+=n0;
cout<<"Case "<<++kase<<": the next triple peak occurs in "<<ans<<" days."<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: