POJ1006 Biorhythms——剩余定理

来源:互联网 发布:北斗网络时间服务器 编辑:程序博客网 时间:2024/05/18 17:04

从水题开始解题报告。

 

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;

}

 

以上。

 

原创粉丝点击