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

浙公网安备 33010602011771号