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;真漂亮!
"中国剩余定理"的经典例子:
《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“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; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- 2632 Crashing Robots的解决方法
- 1573 Robot Motion (简单题)
- poj 2485 Highways
- poj 1511 Invitation Cards
- poj1042
- poj1080
- poj1088
- poj1063 Flip and Shift
- poj 3249 Test for Job 最长路
- 状态压缩DP poj 2817 WordStack 入门题
- POJ 1979
- 线段树的运用 以及poj上的经典题目
- POJ 2801 填词游戏
- POJ1003解题方案