0x37 容斥原理与莫比乌斯函数

· · 个人记录

容斥原理

包含原理

S_1,S_2,S_3,\cdots,S_n 为有限集合,|S| 表示集合 S 的大小,则:

|\bigcup \limits_{i=1}^n S_i|=\sum\limits_{i=1}^n|S_i|-\sum\limits_{i=1,j=1,i<j}^n |S_i\cap S_j|+\sum\limits_{i=1,j=1,k=1,i<j<k}^n|S_{i}\cap S_j\cap S_k|-\cdots+(-1)^{n+1}|S_1\cap S_2\cap\cdots\cap S_n| =\sum_{k=1}^n(-1)^{k+1}\biggl (\sum\limits_{1\leq i_1<i_2<\cdots<i_k\leq n} |\bigcap\limits_{j=1}^kS_{i_j}|\biggr)

翻译成人话就是:一些有限集合的并集的元素个数,等于所有集合的元素个数之和,减去任意两个集合交集的元素个数之和,加上任意三个集合交集的元素个数之和,以此类推

证明: 考虑一个属于左侧并集的元素 a ,假设 a\in S_{i_1},S_{i_2},S_{i_3},\cdots,S_{i_k},(k\in[1,n],i_j\in[1,n]) 这几个集合,且不属于其他集合,那么在上式左端a产生了一次贡献,在上式右端,第一个求和中a产生了 C_{k}^1 次贡献,第二个求和中a产生了 C_{k}^2 次贡献(任意两个集合之交都会恰好统计一次,而k个包含a的集合产生的两集合之交一共是k个集合中选两个的方案数),以此类推。 最终a对右侧的贡献为

\sum_{i=1}^n(-1)^{i-1}C_k^i =C_k^0-\sum_{i=0}^n(-1)^iC_k^i

根据二项式定理,(x+1)^k=\sum_{i=0}^nC_k^i x^i,可得:

=C_k^0-(-1+1)^k=1

对于每个存在于所有集合并集的元素,其对两边的贡献都是1,对于不存在于任意集合中的元素,对两边的贡献都是0,因此最终两边相等。

证毕.

应用

包含原理主要运用于多种情况分类讨论,最后合并为一个大集合时的计数原理

逐步淘汰原理(筛法公式)——排除原理

定理:设 S 为问题全集,A_i\subset S,则:

|\bigcap_{i=1}^n \complement_SA_i|=|S|-\sum_{1\leq i\leq n}|A_i|+\sum_{1\leq i<j\leq n}|A_i\cap A_j|-\cdots+(-1)^n|A_1\cap _2\cap \cdots\cap A_n| =|S|-|\bigcup_{i=1}^n A_i|

翻译成人话,就是从全集中不断减去一些集合,一个元素重复的减去只算作一次,那么最后剩下的元素数量,就等于全集减去这些集合并起来的元素数量(这是很显然的)

证明: 根据上面的语言叙述,我们不难想到,每个集合的补集的交就相当于这些集合的并的补集。这实际上是德·摩根定律的集合论形式,即 \complement_U(A\cup B)=\complement_UA\cap \complement_UB

因此 |\bigcap_{i=1}^n \complement_SA_i|=|\complement_S(\bigcup_{i=1}^nA_i)|=|S|-|\bigcup_{i=1}^n A_i|

应用

这个公式相对于包含原理有更广泛的运用,主要用于正着求不好求的时候,可以求不满足给定条件的数量(从任意转化为存在),然后得到给定条件1的方案数量,再用排除原理算出去掉这些不满足条件2的情况的数量。

上述两种原理称为包含与排除原理

例1:伯努利装错信笺问题

有n个不同的信和n个不同的信封,第i封信与第i个信封对应,每个信封放且只放一封信,求不存在一封装对的信的情况下,放信的方案数。

解: 将一种放法定义为集合的一个元素,那么不考虑没有信装对这一个条件,放法总数就是 A_n^n=n!,其全集对应为 S

然后我们利用逐步淘汰原理,从这个全集中去掉有一个信放对的,加上有两个信放对的,去掉有三个信放对的,以此类推,假设有一个信i放对的集合为 A_{i},则:

|A_i|=(n-1)!,|A_i\cap A_j|=(n-2)!,|A_i\cap A_j\cap A_k|=(n-3)!,\cdots |S|-C_n^1(n-1)!+C_n^2(n-2)!-\cdots+(-1)^nC_n^n =n!(1-\frac{1}{1!}+\frac{1}{2!}-\cdots+(-1)^n\frac{1}{n!})

这个问题又叫做乱序排列问题,即将n个元素排列打乱,使每个元素都不在原来的位置上的排列数

置换及不动点

给定集合 X=\{1,2,3,\cdots,n\},设 \varphi 是从 XX 上的双射,记为:

1&2&\cdots&n\\\varphi(1)&\varphi(2)&\cdots&\varphi(n) \end{matrix}\right\}

则称 \varphiX 上的置换,其中 \varphi(i) 是元素 i 在映射 \varphi 下的象。因为是一一对应,所以 \varphi(1),\varphi(2),\cdots,\varphi(n) 是一个n个全排列。

满足 \varphi(i)=ii 称为 \varphi 的一个不动点

根据上例,集合 X=\{1,2,\cdots,n\} 上没有任何不动点的置换个数为:

D_n=n!\sum_{i=0}^n\frac{(-1)^i}{i!}

例2

\varphi 是集合 X=\{1,2,\cdots,n\} 上的置换,将 X 上没有不动点的置换个数记为 f_n,恰有一个不动点的置换个数记为 g_n ,证明:|f_n-g_n|=1

证明:g_{n_i} 表示恰有一个不动点 i 的方案数,则有 g_n=\sum_{i=1}^n g_{n_i}

由于恰有一个不动点,就相当于剩下n-1个点都不是不动点,因此 g_{n_i}=D_{n-1},所以 g_n=nD_{n-1},所以:

|f_n-g_n|=|D_n-nD_{n-1}| =|n!\sum_{i=0}^n\frac{(-1)^i}{i!}-n\cdot (n-1)!\sum_{i=0}^{n-1}\frac{(-1)^i}{i!}| =|n!\cdot \frac{(-1)^n}{n!}|=1

证毕.

多重集的组合数

S 是由 n_1a_1n_2a_2,直到 n_ka_k 组成的多重集,一共有 n 个元素,则对于任意整数 m\leq n,从S中取出m个组成的多重集的数量为:

C_{k+m-1}^{k-1}-\sum_{i=1}^n C_{k+m-n_i-2}^{k-1}+\sum_{1\leq i<j\leq k}C_{k+m-n_i-n_j-3}^{k-1}-\cdots +(-1)^kC_{k+m-\sum_{i=1}^k n_i-k-1}

证明: 首先假设没有每个元素取用个数限制,则根据可重复的组合原理,组合个数为 C_{k+m-1}^{k-1}

考虑构造集合 S_i 为第i种元素至少选了 n_i+1 个的情况,那么我们可以先选出 n_i+1a_i,然后无限制地选剩下的,方案为 C_{k+(m-n_i-1)-1}^{k-1},这就是 |S_i|

然后对于 |S_i\cap S_j|,即是第i种和第j种元素都至少有 n_i+1n_j+1 个,那么方案数就是先选出 n_i+1a_i,再选出 n_j+1a_j,最后再无限制地选剩下的,方案为 C_{k+(m-n_i-1-n_j-1)-1}^{k-1}

以此类推,再根据筛法公式,就得到了上式

证毕.

注意: 如果组合数中选出的数大于原有元素个数,那么暂时认为其方案数为0.

莫比乌斯函数

除了从狄利克雷卷积的角度考虑单位元的逆元为莫比乌斯函数,还可以从容斥原理角度考虑。

首先列出莫比乌斯函数的解析式:

n=\prod_{i=1}^kp^{c_i}_i

\mu(n)= \begin{cases} 0 &\exists c_i>1\\ (-1)^k &else \end{cases}

然后考虑莫比乌斯反演里面的一个经典问题:求 \sum_{i=1}^a\sum_{j=1}^b[\gcd(a,b)=k]

首先按反演的思路处理:(除法均向下取整)

=\sum_{i=1}^{a/k}\sum_{j=1}^{b/k}[\gcd(i,j)=1]

然后我们有一个结论:

=\sum_{i=1}^{\min(a,b)}\mu(i)\sum_{x=1}^a\sum_{y=1}^b[i|\gcd(x,y)]

这个结论可以用容斥证明,设D(a,b,k)=\sum_{x=1}^a\sum_{y=1}^b[k|\gcd(x,y)],求出小于a/k和b/k的互质的数对个数,可以用全部的数对 D(a,b,1)=a*b,减去gcd是某一个质数倍数的数对个数 D(a,b,2),D(a,b,3)\cdots,加上gcd是某两个不同质数乘积倍数的数对个数 D(a,b,6),D(a,b,10),\cdots,减去gcd是某三个质数乘积倍数的数对个数……以此类推。

发现莫比乌斯函数中,奇数个本质不同质因子项为减,偶数个为加,某一个质因子多于一个则为0,因此就是这个容斥的结构,直接放到 D(a,b,i) 的前面作为系数即可。

因此总共的式子就是 \sum_{i=1}^{min(a,b)}\mu(i)D(a,b,i)

D(a,b,i)=\sum_{x=1}^a\sum_{y=1}^b[k|\gcd(x,y)]=\sum_{x=1}^a\sum_{y=1}^b[k|x][k|y]

=\sum_{x=1}^a[k|x]\sum_{y=1}^b[k|y]=\lfloor a/k\rfloor\lfloor b/k\rfloor

因此总的式子就是 \sum_{i=1}^{\min(a,b)}\mu(i)\lfloor a/i\rfloor\lfloor b/i\rfloor ,莫比乌斯函数用线性筛,D函数用二维整除分块计算即可

复杂度为 O(a+T\sqrt a)(设a大于b)