美丽的项链经典容斥解法
这个也算是组合数学里面的一个经典容斥了,在组合数学第5版第六章第二节带重复的组合中的某个例题就讲到了这个问题的排容方法。
首先,对于该问题没有限制条件的版本:从无限集合{a1⋅∞,a2⋅∞,a3⋅∞,…,ak⋅∞}中选取n个对象的方案数,该问题可以转换成方程:
x1+x2+x3+x4+⋯+xk=n
的解的数量。其中x1,x2,…,xk的值就对应着选择元素a1,a2,…,ak的数量,而这个方程的解的数量又可以转换成集合{1⋅n,∗⋅k−1}的排列的数量,即用k-1个*号将n个1划分成k份。又由于*和1都没有区别。所以该排列的数量就是
Cn+k−1k−1
即从n+k-1个位置中选k-1个位置给*号的方案数。
已知在无限制的情况下选取的的方法之后现在就可以讨论有下限的情况了,即对于类型ai的元素,至少要选bi个,这种情况下我依旧可以采用如上的转换,只不过这里设yi=xi−bi,这样对于yi的求解便没有限制了,于是得到方程
i=1∑kyi=n−i=1∑kbi
利用如上的隔板法得到该问题的方案数为
Cn+k−1−∑i=1kbik−1
这样便解决了下界的限制,然后就是上界,对于上界目前我并不知道直接求解的方式,但可以利用容斥原理的经典容斥来解。
什么是经典的容斥呢,给出如下问题有3个相互之间都有交集的集合A1,A2,A3,已知∣A1∣=30,∣A2∣=50,∣A3∣=40,∣A1⋂A2∣=20,∣A2⋂A3∣=10,∣A1⋂A3∣=10,∣A1⋂A2⋂A3∣=5,问你A1⋃A2⋃A3=?.答案如下:
A1⋃A2⋃A3=∣A1∣+∣A2∣+∣A3∣−∣A1⋂A2∣−∣A2⋂A3∣−∣A1⋂A3∣+∣A1⋂A2⋂A3∣
接下来来看看本题的限制条件已知无限集合{a1⋅∞,a2⋅∞,a3⋅∞,…,ak⋅∞},我们要从中选取n个元素,设这些元素的选取个数分别如下x1,x2,…xk,并且,我们规定∀xi,li≤xi≤ri,在这里我们可以设Pi为yi≥ri+1的性质,设Ai表示满足性质Pi的解组成的子集。并设全集⋃为满足性质xi≥li的解的集合,于是原问题的解变成了计算集合⋂i=1kAi的大小,也就是∣⋃∣−∣⋃i=1kAi∣。这里便将所有计算都变成了只有下界的计算,接下来便是枚举性质Pi的选取方案来求A1⋃A2⋃A3⋃⋯⋃Ak的大小了,这里可以采用2进制状态压缩来枚举,因为对于每一个子集的每一个元素,都只有两种状态,具备性质Pi(yi≥ri+1)或者Pi(yi≥li)。同时二进制中1的个数代表具备性质Pi的子集的个数决定了该方案的符号。