POJ1006 中国剩余定理

“今有物不知其数,三三数之余二,五五数之余三,七七数之余二,求物几何”

问的是现在有一堆物品,物品数除以三余二,除以五余三,除以七余二,求物品有多少个。

 

这个问题的解法很简单,lcm(3,5)=15  lcm(3,7)=21  lcm(5,7)=35  lcm(3,5,7)=105

15%7=1  21%5=1  35*2%3=1

因此15*2+21*3+70*2=233,233%105=23即为解。

 

本题题意为人有三个生理周期,长度分别为23、28、33天,表明经过23、28、33天,人分别会出现3种生理高峰期。现在提供这三种高峰期出现的某一天的日期,并且提供当前的日期,要求经过多少天之后会出现三种高峰期出现在同一天的情况。

 

设提供的三种高峰期出现的日期分别为p,e,i,当前日期为d,设所求的三种高峰期同时出现的日期为ans。则ans%23=p, ans%28=e, ans%33=i

 

解这个同余式组可以采用如下方法,先求出最小公倍数lcm(23,28)、lcm(23,33)、lcm(28,33)、lcm(23,28,33)

 

设a=k1*lcm(23,28)是满足a%33=1的最小数,同理b=k2*lcm(23,33),c=k3*lcm(28,33)

接着ans=(p*c+e*b+i*a) % lcm(23,28,33)

之所以要用p*c+e*b+i*a,举p*c说明,由于c%23==1,p*c才能满足p*c%23==p,而a与b本来就可以被23整除,因此ans%23==1成立。

接着ans-=d,注意若此时ans<=0必须使ans+=lcm(23,28,33)

#include<iostream>
using namespace std;
int main()
{
	int a, b, c, d;
	int ans, ncase=1;
	while (scanf("%d%d%d%d", &a, &b, &c, &d)!=EOF)
	{
		if (a==-1) break;
		ans = (a * 5544 + b * 14421 + c * 1288) % 21252;
		ans -= d;
		if (ans<=0) ans += 21252;
		printf("Case %d: the next triple peak occurs in %d days.\n", ncase++, ans);
	}
	return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值