在做C入门题的时候做了这个
在中国数学史上,广泛流传着一个“韩信点兵”的故事:韩信是汉高祖刘邦手下的大将,他英勇善战,智谋超群,为汉朝建立了卓越的功劳。据说韩信的数学水平也非常高超,他在点兵的时候,为了知道有多少兵,同时又能保住军事机密,便让士兵排队报数:
- 按从1至5报数,记下最末一个士兵报的数为1;
- 再按从1至6报数,记下最末一个士兵报的数为5;
- 再按从1至7报数,记下最末一个士兵报的数为4;
- 最后按从1至11报数,最末一个士兵报的数为10;
请编写程序计算韩信至少有多少兵。
输入格式:
本题无输入
输出格式:
输出韩信至少拥有的士兵人数。
好像又回到了小学,发现这个是中国剩余定理的内容,有关数论,还有与之相关的还有什么欧几里得,以及线性同余,表示自己对这个并不感什么兴趣啊,但是一查发现就这种数论还有蛮多的应用,我这里先做一些初步的吧,不想做深入地探究,毕竟这不是我最终想做的事。
搜索了那么多,然后发现wiki上的其实比较权威,或许真正我敢去硬着头皮看这些公式的时候就试在wiki上的吧,之前都被那种什么公式给吓到了。所以大家不要怕,就耐下性子看看。
把wiki上的粘过来了。
形式描述[编辑]
用现代数学的语言来说明的话,中国剩余定理给出了以下的一元线性同余方程组:
-
{\displaystyle (S):\quad \left\{{\begin{matrix}x\equiv a_{1}{\pmod {m_{1}}}\\x\equiv a_{2}{\pmod {m_{2}}}\\\vdots \qquad \qquad \qquad \\x\equiv a_{n}{\pmod {m_{n}}}\end{matrix}}\right.}
有解的判定条件,并用构造法给出了在有解情况下解的具体形式。
中国剩余定理说明:假设整数m1, m2, ... , mn其中任两数互质,则对任意的整数:a1, a2, ... , an,方程组{\displaystyle (S)}有解,并且通解可以用如下方式构造得到:
- 设{\displaystyle M=m_{1}\times m_{2}\times \cdots \times m_{n}=\prod _{i=1}^{n}m_{i}}是整数m1, m2, ... , mn的乘积,并设{\displaystyle M_{i}=M/m_{i},\;\;\forall i\in \{1,2,\cdots ,n\}},即{\displaystyle M_{i}}是除了mi以外的n − 1个整数的乘积。
- 设{\displaystyle t_{i}=M_{i}^{-1}}为{\displaystyle M_{i}}模{\displaystyle m_{i}}的数论倒数:{\displaystyle t_{i}M_{i}\equiv 1{\pmod {m_{i}}},\;\;\forall i\in \{1,2,\cdots ,n\}.}
- 方程组{\displaystyle (S)}的通解形式为:{\displaystyle x=a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}+kM=kM+\sum _{i=1}^{n}a_{i}t_{i}M_{i},\quad k\in \mathbb {Z} .} 在模{\displaystyle M}的意义下,方程组{\displaystyle (S)}只有一个解:{\displaystyle x=\sum _{i=1}^{n}a_{i}t_{i}M_{i}.}
从假设可知,对任何{\displaystyle i\in \{1,2,\cdots ,n\}},由于{\displaystyle \forall j\in \{1,2,\cdots ,n\},\;j\neq i,\;\;\operatorname {gcd} (m_{i},m_{j})=1},所以{\displaystyle \operatorname {gcd} (m_{i},M_{i})=1.} 这说明存在整数{\displaystyle t_{i}}使得{\displaystyle t_{i}M_{i}\equiv 1{\pmod {m_{i}}}.}这样的{\displaystyle t_{i}}叫做{\displaystyle M_{i}}模{\displaystyle m_{i}}的数论倒数。考察乘积{\displaystyle a_{i}t_{i}M_{i}}可知:
-
{\displaystyle a_{i}t_{i}M_{i}\equiv a_{i}\cdot 1\equiv a_{i}{\pmod {m_{i}}},}
-
{\displaystyle \forall j\in \{1,2,\cdots ,n\},\;j\neq i,\;\;a_{i}t_{i}M_{i}\equiv 0{\pmod {m_{j}}}.}
所以{\displaystyle x=a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}}满足:
-
{\displaystyle \forall i\in \{1,2,\cdots ,n\},\;\;x=a_{i}t_{i}M_{i}+\sum _{j\neq i}a_{j}t_{j}M_{j}\equiv a_{i}+\sum _{j\neq i}0\equiv a_{i}{\pmod {m_{i}}}.}
这说明{\displaystyle x}就是方程组{\displaystyle (S)}的一个解。
另外,假设{\displaystyle x_{1}}和{\displaystyle x_{2}}都是方程组{\displaystyle (S)}的解,那么:
-
{\displaystyle \forall i\in \{1,2,\cdots ,n\},\;\;x_{1}-x_{2}\equiv 0{\pmod {m_{i}}}.}
而{\displaystyle m_{1},m_{2},\ldots ,m_{n}}两两互质,这说明{\displaystyle M=\prod _{i=1}^{n}m_{i}}整除{\displaystyle x_{1}-x_{2}}. 所以方程组{\displaystyle (S)}的任何两个解之间必然相差{\displaystyle M}的整数倍。而另一方面,{\displaystyle x=a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}}是一个解,同时所有形式为:
-
{\displaystyle a_{1}t_{1}M_{1}+a_{2}t_{2}M_{2}+\cdots +a_{n}t_{n}M_{n}+kM=kM+\sum _{i=1}^{n}a_{i}t_{i}M_{i},\quad k\in \mathbb {Z} }
的整数也是方程组{\displaystyle (S)}的解。所以方程组{\displaystyle (S)}所有的解的集合就是:
{\displaystyle \{kM+\sum _{i=1}^{n}a_{i}t_{i}M_{i}\;;\quad k\in \mathbb {Z} \}.}
其实看完了之后大家可以把我上面的题目给用下面的代着做一下,然后也就基本能判断是否掌握。但是呢我想既然这个知识对自己没什么用,那么我就要从中学习到一些思想,看看咱们老祖宗是怎么想出这样简单的方法。
第一次做的话我们大多数人都会想慢慢搜索,从第一个数满足的条件中找出所有,再在这里面找满足第二个的,以此类推。。。。但是呢这样要循环的太多了,所以我们要分析,分析的话必然是找规律,我们现在有两个问题,第一个数到底怎么判断出来,所有的数之间到底有什么规律。这里第一个问题就是我们的题目,而第二个问题是我们蛮自然会想到的,但是很有可能不会去深究。(其实在解决很多问题的时候我们可能会觉得现在的问题是什么,然后就完全集中于那个问题,其实这就像我们一直做题目里面有第一问有第二问一样,有的时候我们解决的问题只给出了最后一问,或者说没有给出前几问来引导你,这时候可能就需要我们自己的一些发散,把自己心中想问的问题记录下来,然后先看看那个问题怎么解决,然后呢,实在无法解决的时候,我们就看看自己心中问的一些问题)
这里第一个问题就是自己无法想到,而第二个问题,其实也难以直接看出,我们需要设处两个数,然后问问自己,第一个满足一系列的那个情况,第二满足一系列的条件,那我们两者之间到底有什么联系呢,数与数之间嘛,我们在高中做数列,分析规律的时候无非就是加加减减,看看得出来的东西是否有规律,不行的话再乘个方。
这里我们自然就想到了减,那么减的话,又代表了什么呢,在把他跟那些条件放在一起,然后就发现这个除所有得出来的余数是0,注意我们这里讨论的是他们都互质的情况,所以这个差值必然就是所有数的最小公倍数。
可是把这个问题解决了好像对我们第一个问题的用处也不大,那么我们就这样想,现在我们要同时满足很多个条件,要同时考虑起来非常的麻烦,所以我们看看能不能每一次只用考虑一个,然后再把他们组合到一起,比如说上面的除以5余1,我可以找到很多数,然后我除6余5,同样的,我们要建立一个统一的规则,然后把这些个组合到一起,但是他们除某一个的时候不会对别的产生影响,比方说除5余1是某个数,然后其他的相加起来除5必须得是0,同样的这是个互相的关系,你除6余5,我本来除5余1的部分以及其他的部分除以6就要整除,这样的话自然想到了上面wiki的Mi,而这里就是我的每一个部分都是有一个Mi,现在呢要解决的问题就是这个又要含有Mi 又能够除以某一个数指定余多少,这个该怎么做,这个好像涉及到欧几里得算法,唉又要去查了,先不管了!
还剩下非互质的情况,以及辗转相除法,以及辗转相除法在别的东西里面的应用。