POJ 1006

#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
    int p,e,i,d;
    int index=0;

    while(cin>>p>>e>>i>>d)
    {
        if(p==-1)
            break;
        int n=(5544*p+14421*e+1288*i-d)%(21252);
        if(n<=0)
            n+=21252;
        cout<<"Case "<<++index<<": the next triple peak occurs in "<<n<<" days."<<endl;
    }
    return 0;
}

这一题开始读错了。以至于走了很大弯路。我的这个英语水啊~

给出的p,e,i都是距离当前年份的第一天的第一个三个峰值同时出现的天数,之后每隔23 28 33天依次出现各自的峰值。题目给定从第d天起,问多少天后三个峰值再次同时出现。

那么这个问题就很简单了。设n天后triple peak,那么n-p,n-e,n-i三个分别是23 28 33的倍数。求出n后,最后输出的结果是n-d。

这是一种思路,当然可以在具体编码求解的时候进行局部的优化。
但问题是,这个题目远没有这么简单。其中包含的数学思想可以值得我们学学。这个思想就是剩余定理!

 

posted @ 2011-08-05 22:08  IT屁民  阅读(158)  评论(0编辑  收藏  举报