注明:此篇的原理来自于《组合数学》原书第五版。
这篇是组合数学第四更了,以后可能还继续写,拖延症犯一下。
定理1:集合S中不具有性质P1,P2,…,Pm的对象个数由下面的交错表达式给出:
我们来证明一下。
想得美,略(其实我也不会)。
穿插点知识,下面有用得到,对于第一个和,对所有1子集求和,故有,第二个和,对所有2子集求和,故有,以此类推,对于第m个和,有,所有我们根据 二项式定理,得到总和为 2^m 个。
推论1:集合S中至少具有性质P1,P2,…,Pm之一的对象个数由下式给出:
证明:
又已知,
所以
例子:求从1到1000之间不能被 5,6和8整除的整数个数。
解决:设P1表示能被5整除的性质,P2表示能被6整除的性质,P3表示能被8整除的性质。
对于i=1,2,3,设Ai是S中具有Pi性质的整数组成的集合。
故我们要求
|A1|=⌊1000/5⌋ =200 (⌊r⌋表示不超过r的最大整数),|A2|=⌊1000/6⌋=166,|A3|=⌊1000/8⌋,
|A1∩ A2| =⌊1000/30⌋=33 (lcm{5,6}=30),同理,|A1∩ A3|=⌊1000/40⌋=25,|A2∩ A3|=⌊1000/24⌋=41
|A1∩ A2∩ A3|=⌊1000/120⌋=8 (lcm{5,6,8}=120),
因此根据容斥定理可知,在1到1000之间不能被5,6,8整除的整数个数等于
=1000-(200+166+125)+(33+25+41)-8=600
容斥原理的特殊情况:
假设在容斥原理中出现的集合 A1∩?2∩?3∩?4 的大小仅依赖于k而不依赖在交集中使用了哪k个集合。因此,就存在常数 a0,a1,a2,..,am ,使得
a0=|S|,a1=|A1|=|A2|=… =|Am|,
a2=|A1∩?2|=…=|???∩??|
a3=|A1∩?2∩?3|=…=|??∩??∩??|
am=|?1∩?2∩…∩??|
在这种情况下,容斥原理可以简化成 :
例题:在0到99999之间有多少含有数字2,5和8的整数?
解决:设S是0到99999之间的集合(把S中的每个整数都看做有5个数字,不够补为前导0),
设?1是一个不包含数字2整数的性质,依次类推。
设Ai(i=1,2,3)是S中具有性质Pi的整数的集合。
故我们需求:
利用上文容斥原理的特殊情况 ,我们可以得
a0=10^5,a1=9^5,a2=8^5,a3=7^5,
咱就举a2来说说,在0-99999之间不包含2,5的整数个数(即集合|A1∩A2|的大小,当然也可以取其它两个,随意)等于多重集合{5∙∙0,5∙1,5∙3,5∙4,5∙6,5∙7,5∙8,5∙9} (n∙?表示有n个k),的5排列的数目,这个集合包含8个符号,每个符号的重数是5,所以它的5排列数目等于8^5,
最后我们根据容斥原理的特殊情况公式得到答案为 10^5-3*9^5+3*8^5-7^5。
给出几道题:
题1:hdu 1695
题解:https://blog.csdn.net/LJD201724114126/article/details/82661566
题二:计蒜客
题解:https://blog.csdn.net/LJD201724114126/article/details/82620754
题三:hdu 4407
题解:https://blog.csdn.net/LJD201724114126/article/details/83107747
咦,这里的题解链接好像都是我本人的,啊,不管了,就当施舍点访问量给我了。
总结一下:
这里用的容斥,很巧妙的应用二进制来处理,每个数的二进制位表示取于不取,这点可以看成是以后解题的思想,应用二进制来处理取于不取这类似的问题。
我的标签:做个有情怀的程序员。