从水题开始解题报告。
problem address:http://poj.org/problem?id=1006
刚开始用一般算法,从一开始计数判断。WA了两次后提交通过。
代码如下:
//Memory=744K Time=282Ms
#include <iostream>
using namespace std;
int main()
{
int p,e,i,d,y,ct=1;
while(cin>>p>>e>>i>>d)
{
if (p==-1 && e==-1 && i==-1 && d==-1) break;
y = 1;
if (y<p) y=p;
if (y<e) y=e;
if (y<i) y=i;
for (;(y-p)%23!=0 || (y-e)%28!=0 || (y-i)%33!=0; y++);
y = (y-d)%21252;
if (y<=0) y = y+21252;//注意相减小于零的情况
cout<<"Case "<<ct<<": the next triple peak occurs in "<<y<<" days./n";
ct++;
}
return 0;
}
之后看了一下Discuss,认识了剩余定理。
剩余定理百度地址:http://baike.baidu.com/view/838598.htm
28*33*6=924*6=5544=1 mod 22
23*33*19=759*19=14421=1 mod 28
23*28*2=644*2=1288=1 mod 33
则5544*p +14421*e+1288*i -21252*n-d为所求答案
代码如下:
//使用剩余定理的代码Memory=748K Time=94Ms
#include <iostream>
using namespace std;
int main()
{
int p,e,i,d,y,ct=1;
while(cin>>p>>e>>i>>d)
{
if (p==-1 && e==-1 && i==-1 && d==-1) break;
y=5544*p+14421*e+1288*i;
y = y - y/21252*21252 - d;
if (y<=0) y = y+21252;
cout<<"Case "<<ct<<": the next triple peak occurs in "<<y<<" days./n";
ct++;
}
return 0;
}
以上。