POJ 1006 中国剩余定理

原创 2013年12月01日 21:32:13

初见poj1006用的暴力破解写的代码,写完以后发现很搓。上网一查原来古人早就对此类问题有了解答规则。


一、中国剩余定理

一元线性同余方程组问题最早可见于中国南北朝时期(公元5世纪)的数学著作《孙子算经》卷下第二十六题,叫做“物不知数”问题,原文如下:

有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。《孙子算经》中首次提到了同余方程组问题,以及以上具体问题的解法,因此在中文数学文献中也会将中国剩余定理称为孙子定理。

宋朝数学家秦九韶1247年数书九章》卷一、二《大衍类》对“物不知数”问题做出了完整系统的解答。明朝数学家程大位将解法编成易于上口的《孙子歌诀》:

三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五使得知

这个歌诀给出了模数为3、5、7时候的同余方程的秦九韶解法。意思是:将除以3得到的余数乘以70,将除以5得到的余数乘以21,将除以7得到的余数乘以15,全部加起来后除以105,得到的余数就是答案。比如说在以上的物不知数问题里面,使用以上的方法计算就得到

70 \times 2 + 21 \times 3 + 15 \times 2 = 233 = 2\times 105 +23.

因此按歌诀求出的结果就是23.

大致过程是:

n1*5*7%3=1,则n1最小为2;2*5*7=70.

n2*3*7%5=1,则n2最小为1;1*3*7=21.

n3*5*3%7=1,则n3最小为1;1*3*5=15.

n%3=2; 

n%5=3;

n%7=2;

所以n=(70*2+21*3+15*2)%(3*5*7)=233%105=23.


二、求解

有了上边的算法,求解poj1006就很简单啦。由题意我们很容易得到:

(n+d)%23=p;

(n+d)%28=e;

(n+d)%33=i;
并且,若a%b=c, k为正整数,则k*a%b=(k*c)%b

33*28%23=4,则6*33*28%23=4*6%23=1;  6*33*28=5544

23*33%28=3,则19*23*33%28=19*3%28=1;   19*23*33=14421

28*23%33=17,则2*28*23%33=2*17%33=1;  2*28*23=1288

23、28、33互质,最小公倍数23*28*33=21252

(5544*p+14421*e+1288*i)%21252=n+d


代码如下:

#include "stdafx.h"
#include<iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{	
	int p,e,i,d;
	cin>>p>>e>>i>>d;
	int num=0;
	int arr[10000][4];//用二维数组存储输入
	while(!(p==-1&&e==-1&&i==-1&&d==-1)){
		arr[num][0]=p;
		arr[num][1]=e;
		arr[num][2]=i;
		arr[num][3]=d;
		num++;//num记录输入数据的组数
		cin>>p>>e>>i>>d;

	}
	for(int i=0;i<num;i++){
		int j=(5544*arr[i][0]+14421*arr[i][1]+1288*arr[i][2])%21252-arr[i][3];
		if(j<=0)//防止出现输出0或者负数的情况
			j+=21252;
	  cout<<"Case "<<i+1<<": the next triple peak occurs in "<<j<<" days."<<endl;

	}
	return 0;
}




POJ 1006 Biorhythms 【中国剩余定理】

Description Some people believe that there are three cycles in a person's life that start the day h...

poj 1006中国剩余定理(模板题)

点击打开链接 参考 证明 #include #include #include using namespace std; int m[4],a[4]; void exgcd(int a,...

POJ 1006 Biorhythms 解题报告(中国剩余定理)

Biorhythms Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 109889   A...
  • kbdwo
  • kbdwo
  • 2014年04月24日 09:50
  • 478

poj 1006(中国剩余定理)

中国剩余定理: 《孙子算经》中有“物不知数”问题:“今有物不知其数,三三数之余二 ,五五数之余三 ,七七数之余二,问物几何?”答为“23”。  --------这个就是传说中的“中国剩余定...

数学-poj1006 (中国剩余定理)

poj1006 (中国剩余定理) 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,...

20140714 「初等数论 - 中国剩余定理」 POJ 1006 Biorhythms

数论:拓展欧几里得 + 同余模方程模板一份。 题解嘛,有空再补。。。(其实就是模板题。) #include #include using namespace std; type...

poj 1006+hdu 1788(中国剩余定理求解同余方程组)

中国剩余定理: 求解此类同余方程组最小非负整数解的算法实现: ll China() { ll M1,ans=0; M=1; for(int i=1;i...

poj 1006 Biorhythms (中国剩余定理)

摘录了一些讲解中国剩余定理的博客,感觉他们写的很好 易懂。 看完这三篇 对中国剩余定理应该也是能够对他有些了解了。 题目链接:点击打开链接 该题代码: #include using namespa...
  • CillyB
  • CillyB
  • 2016年11月16日 15:42
  • 201

poj1006 扩展欧几里得算法+中国剩余定理

题意:physical、emotional和intellectual的周期分别为23、28和33天。现给出三个日期,p、e和i,分别对应physical、emotional和intellectual出...
  • aidway
  • aidway
  • 2016年01月25日 22:53
  • 243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1006 中国剩余定理
举报原因:
原因补充:

(最多只允许输入30个字)