容斥原理

Published: by Creative Commons Licence

  • Tags:

容斥原理

假设有全集U,以及全集的若干子集A1,A2,,Ak

在实际应用中要统计多个子集的交集的大小是比较容易的,但是要统计多个子集的并集的大小则比较困难。对于这种情况,我们可以使用容斥原理将并运算简化为若干次交运算。

K表示由1,2,,k组成的集合。容斥原理的公式如下:

|A1A2Ak|=IKI(1)|I||iIAi|

以及

|¯A1A2Ak|=|S||A1A2Ak|=IK(1)|I||iIAi|

广义容斥原理

给定全集U,以及全集的若干子集A1,A2,,Ak

容斥原理求的是U中有多少元素被至少一个子集Ai所包含。而广义容斥求的是被正好m个子集所包含的元素数目。

α(m)=IK|I|=m|iIAi|。记β(m)表示被正好m个子集包含的元素数目,那么有:

β(m)=|U|i=m(1)im(im)α(i)

证明如下:

考虑任意一个元素eU,设et个子集中出现。考虑三种情况:

  • t<m,那么t在等式的左右贡献都是0
  • t=m,那么t在等式的左右贡献恰好都是1
  • t>m,那么t在等式的左右贡献都是0

其中t>m的情况详细说明一下右边为什么是0。很显然tα(i)中贡献为(ti)。因此对右边的贡献为:

ti=m(1)im(im)(ti)=ti=m(1)im(tm)(tmim)=(tm)tmi=0(1)i(tmi)=(tm)(11)tm=0

提供一道题目:

min-max容斥

max{S}=TS(1)|T|+1min{T}min{S}=TS(1)|T|+1max{T}

证明:

考虑第一个公式。假设xS中的第i+1大元素。那么x的展开项系数为:

ij=0(1)j(ij)=(11)i=0i

因此只有当i0时,系数为1,其它情况都为0。第二个公式同理可证。

提供一些题目:

k-th min-max容斥

定义mink(S)表示S中第k小的数,对应的记maxk(S)表示S中第k大的数。

kmax(S)=TS(1)|T|k(|T|1k1)min(T)kmin(S)=TS(1)|T|k(|T|1k1)max(T)

证明如下:

仅证明maxk(S)的展开公式,mink(S)的展开公式类似。

考虑第x+1大的数的系数:

xi=0(1)i+1k(ik1)(xi)=xi=k1(1)i+1k(xk1)(x(k1)i(k1))=(xk1)x(k1)i=0(1)i(x(k1)i)=(xk1)(11)x(k1)=[x=k1]

因此只有第k大的数正好贡献一次。

提供一些题目:

参考资料