您的位置:首页 > 其它

poj 1006 Biorhythms 中国剩余定理

2014-02-22 23:34 204 查看
这道题真是花费n多时间啊,关键我就是想知道事情的来龙去脉.

"中国剩余定理"的经典例子:

《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“23”。

 --------这个就是传说中的“中国剩余定理”。 其实题目的意思就是,n % 3 = 2, n % 5 = 3, n % 7 = 2; 问n是多少?

那么他是怎么解决的呢?

看下面:

题目中所涉及的3,5,7三个互质的数,(补充:)

(一个数的多少倍除以另一个数所得的余数为0,应该在互为素数里面吧)

(a%b=c-->(a+bk)%b=c)

(a%b=c-->(a*k)%bb=kc)

令:5*7*a%3=1;---------->a=2;即5*7*2=70;

   3*7*b%5=1;---------->b=1;即3*7*1=21;

   3*5*c%b=1;---------->c=1;即3*5*1=15;

为什么要使余数为1?是为了要求余数2的话,只要乘以2就可以了.要求余数为3的话,只要乘以3就可以了

(因为题目是在求n%3=2;n%5=3;n%7=2;)

(5*7*2)*2可以被5和7整除,但是%3等于2;

(3*7*1)*3可以被3和7整除,但是%5等于3;

(3*5*1)*2可以被3和5整除,但是%7等于2;

那么即使相加后,%3,5,7的情况也是一样的

那么我们即可得到(5*7*2)*2+(3*7*1)*3+(3*5*1)*2=233;

然后233%(3*5*7)=23;

----------------------------

回到题目中,我们要求那个num,开始的天数为d,依据题意是这样子:

(num+d)%23=p;

(num+d)%28=e;

(num+d)%33=i;令num+d=total;则所求即为num=total-d;

我终于知道怎么求的了.
在23,28,33三个数字是互质的

我们M=23*28*33=21252;M1=21252/23=924;M2=21252/28=759;M3=21252/33=644;

先确定第一个:924*y1=1(mod 23)<==>(924 mod 23)y1(mod 23)<==>4*y1=1(mod)23==>y1=6;

33*28*6=5544;

(除最后一个等号外其余等号是同余的意思,这条性质从哪得到的?)依次类推,只不过推导较麻烦,这到题也就是从这里失去了意义.

759*y2=1(mod 28)<==>3*y2=1(mod 28)==>y2=19;

23*33*19=14421;

644*y3=1(mod 33)<==>17*y3=1(mod 33)==>y3=2;

23*28*2=1288;

那么total=5544*p+14421*e+1288*i;

注意范围限制:total%=21252,如果<=0;total+=21252;真漂亮!
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
//	freopen("1006.txt","r",stdin);
int p,e,i,d,total,kcase=0;//题目中的含义
while(1)
{
scanf("%d%d%d%d",&p,&e,&i,&d);
if(p==-1 && e==-1 && i==-1 &&d==-1 )
break;
total=5544*p+14421*e+1288*i;
kcase++;
total%=21252;
if(total-d<=0)
total+=21252;
printf("Case %d: the next triple peak occurs in %d days.\n",kcase,total-d);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 数论