在组合数学中学习鸽巢原理。其中一道例题是这样的:
从1,2,3,4,..., 200这200个整数中选取101个整数,则一定存在两个数存在整除关系?
解答:
一个数对其按照2进行因式分解,总可写成n = 2 ^ k * t(其中k >=0, t为奇数)。例如2 = 2 ^ 1 * 1; 3 = 2 ^ 0 * 3...
而1到200存在奇数1,3,5,7,..., 199一共100个奇数。我选取101个整数,则说明存在两个整数i,j, 它们经过分解,t是相等的。所以前面的k是不一样的。也就证明了i,j存在整除关系。很简单是吗?请看下面一道扩展题。
从1,2,3,4,..., 200这200个整数中选取100个整数,其中只有一个数小于16,证明一定存在两个数存在整除关系?
我们这样想:
定义两个集合A = {a[1], a[2], ..., a[100]}
B = {1, 3, 5, 7, ..., 199}
其中A是从200个整数中选取的100个整数,而B[i]则是某个a[j]经过按2分解最后的奇数t。
经过思考,若选取的100个数不存在整除关系,则每个数一定映射到不同的奇数。若两个数经分解后得到相同的奇数,则这两个数能够整除。
我们再来分情况讨论,
对于最小数15,
它映射到集合B的元素是15。假设映射到集合B为45的元素为M,则M和15是什么关系呢?一定整除,对不对?所以存在整除。
对于13, 39
11, 33
9, 27
7, 21
5, 15
3, 9
1不用说,肯定存在整除关系。
关键是对于1到15之间的偶数,如何处理?
对于14, 14 = 2 * 7(k = 1)。 映射到B中的元素为7。
我们接着考虑B的为7的倍数的元素{21, 35, 49, 63, 77, 91, 105,..., 189}
我们知道105后面的映射到A就是它们本身,因为A中每个数都小于200.
接着我们随便来考虑一组数值<35, 105>.105是35的倍数,为了使它们两者对应到A中的元素不存在整除,则A中的元素一定是2 ^ k * 35(k > 0)。而这是A中的元素一定是14
的整倍数。所以要么是14的倍数,要么是105和35对应的数存在整数倍关系。
对于10,10 = 2 * 5(k = 1)处理方式和14一样。
对于6,处理方式和14一样。
接着我们来考虑12,8,4,2.
先来考虑2吧。
若A中存在元素2,若不存在整数关系,其它199个数都是奇数。我们知道,这些奇数中肯定存在整除关系。
再来考虑12吧。
对于12,12 = 2 ^ 2 * 3(k = 2, t = 3)
奇数为3.我们来考虑B中的 sub_B={9, 15, 21, 27, ...99, 105, 111, 117, ..., 195}
这些都是3的倍数。
为了不和12产生整除关系设定sub_B 到A中元素的映射关系为 2 ^ k * sub_B[i](其中一定是小于等于1的)
我们知道105以后的k一定是0.我们来看tri_pair<9, 27, 117>117是27的倍数,27是9的倍数。为了是它们映射到A中元素不能整除,所以2 ^ 1 * 27, 2 ^ 2 ^ 9。
这个时候我们发现,2 ^ 2 * 9 已经是12的倍数了。要么9, 27, 117对应于A中的数之间存在整除关系,要么其中有些数是12的倍数,总之,存在整除关系。
来考虑8和4。
对于4 = 2 ^ 2 * 1(k = 2, t = 1)
正如在对于12讨论的那样,一定存在4的倍数。
对于8 = 2 ^ 3 * 1(t = 1)对于3次方如何考虑呢?
还是按照原来的思路。
我们取sub_B = {3, 9, 15, 21, ..., }
这样对于<3, 21, 63, 189>后面的在这里就不写了。
到现在,我们已经将1,2,3,4,5,..., 15全部讨论完了。对于每个数都存在整除关系。