POJ1006Biorhythms——剩余定理

    技术2024-10-01  63

    从水题开始解题报告。

     

    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;

    }

     

    以上。

     

    最新回复(0)