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