北大1006

 题目链接: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值