题目链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1006
这道题主要用了中国剩余定理
1,剩余问题:在整数除法里,一个数同时除以几个两两互质的数,整数商后均有余数,已知各除数和他们对应的余数求满足条件的被除数的问题。
2,中国剩余定理:d1、d2、d3……dn是n个两两互质的整数,若整数x分别被它们除后余数为r1、r2、r3……rn,则满足条件的x为x = R1*r1 + R2*r2 + ……Rn*rn + R*D,其中Ri(i = 1,2,3……n)为除去di的各互质整数的公倍数并且Ri对di的余数为1,R是任意的整数,D是个互质整数的最小公倍数。
3,为了求出Ri,这里给出两个定理:
a)、几个整数相加,如果其中只有一个不能被a整除,那么他们的和也不能被a整除。
b)、两个数不能整除,如果被除数扩大或者缩小n倍,而除数不变那么余数也扩大或缩小n倍对除数的模
本题的三个周期是23、28、33两两互质,大周期是他们的最小公倍数,即21252;给出的p、e、i实际是余数,根据这三个数要求出这种情况是某个大周期中第几天,然后再根据这个结果去确定问题的最终解。确定它是大周期中第几天的问题正是已知除数和对应余数求被除数的剩余问题,可以用中国剩余定理求解。
#include <iostream>
using namespace std;
int main()
{
freopen("in.txt","r",stdin);
int m1,m2,m3,m4,c,res;
c = 1;
while(cin >> m1 >> m2 >> m3 >> m4 &&
!(m1 == -1 && m1 == m2 && m1 == m3 && m1 == m4))
{
res = (5544 * m1 + 14421 * m2 + 1288 * m3 - m4 + 21252) % 21252;//先减m4再加上21252可以避免可能的溢出
if(res == 0)
res = 21252;
cout << "Case " << c++
<< ": the next triple peak occurs in " << res << " days./n";
}
return 0;
}