当前位置: 代码迷 >> 综合 >> POJ 1006 Biorhythms .
  详细解决方案

POJ 1006 Biorhythms .

热度:32   发布时间:2023-09-23 08:31:27.0

裸的中国剩余定理

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

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

#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;
}



  相关解决方案