POJ1006 生理周期
http://poj.org/problem?id=1006
Description
Input
当p = e = i = d = -1时,输入数据结束。
Output
采用以下格式:
Case 1: the next triple peak occurs in 1234 days.
注意:即使结果是1天,也使用复数形式“days”。
Sample Input
0 0 0 0 0 0 0 100 5 20 34 325 4 5 6 7 283 102 23 320 203 301 203 40 -1 -1 -1 -1
Sample Output
Case 1: the next triple peak occurs in 21252 days. Case 2: the next triple peak occurs in 21152 days. Case 3: the next triple peak occurs in 19575 days. Case 4: the next triple peak occurs in 16994 days. Case 5: the next triple peak occurs in 8910 days. Case 6: the next triple peak occurs in 10789 days.
其实这题是一个裸的中国剩余定理的题。
我也不知道怎么讲比较好,本菜鸟数学不好 -> (什么,不知道中国剩余定理?~!@#¥%……&%¥#你需要这个: http://blog.csdn.net/ctrlc_v/article/details/76556941)
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int a[4],m[4];
void exgcd(int a,int b,int &x,int &y)
{
if(b==0)
{
x=1;
y=0;
return;
}
exgcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
}
int CRT(int a[4],int m[4],int n)
{
int M=1;
int ans=0;
for(int i=1;i<=n;i++)
M*=m[i];
for(int i=1;i<=n;i++)
{
int x,y;
int Mi=M/m[i];
exgcd(Mi,m[i],x,y);
ans=(ans+Mi*x*a[i])%M;
}
if(ans<0)
ans+=M;
return ans;
}
int main()
{
ios::sync_with_stdio(false);
int p,e,i,d,t=1;
while (cin >> p >> e >> i >> d)
{
if(p==-1 && e==-1 && i==-1 && d==-1)
break;
a[1]=p;
a[2]=e;
a[3]=i;
m[1]=23;
m[2]=28;
m[3]=33;
int ans=CRT(a,m,3);
if(ans<=d)
ans+=21252;
cout << "Case " << t++ << ": the next triple peak occurs in " << ans-d << " days." << endl;
}
return 0;
}