容斥原理
容斥原理基本公式
对于一个集合 S 的一部分子集构成的簇 P 有:
证明:
考虑每个元素 \(x\),假设它被 \(k\) 个元素包含,那么它的贡献就是 \(\sum\limits_{i=1}^k(-1)^{i-1}\binom{k}{i}\)。
若 \(k=0\),显然该式等于 0。
若 \(k>0\),则:
\(\begin{aligned}\sum\limits_{i=1}^k(-1)^{i-1}\binom{k}{i}&=\sum\limits_{i=0}^k(-1)^{i-1}\binom{k}{i}+1\\&=-\sum\limits_{i=0}^k(-1)^i\binom{k}{i}+1\\&=-(1-1)^k+1=1\end{aligned}\)。
则 \(x\) 的贡献为 \([k>0]\),可得原式。
\(\min-\max\) 容斥
证明:
\(\begin{aligned}\max\limits_{k_{th}}{S}&=\sum\limits_{T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}\min T}\\&=\sum\limits_{x\in S}x\sum\limits_{x\in T\subseteq S}{(-1)^{|T|-k}\dbinom {|T|-1}{k-1}[\min{T}=x]}\end{aligned}\)
令 \(f(x)\) 表示 \(S\) 中大于 \(x\) 的元素构成的集合,则原式:
\(\begin{aligned}=\sum\limits_{x\in S}{x}\sum\limits_{x\in T\subseteq f(x)}{(-1)^{|T|-k}\dbinom{|T|-1}{k-1}}\end{aligned}\)
枚举 \(|T|\),原式:
\(\begin{aligned}&=\sum\limits_{x\in S}{x\sum\limits_{l=1}^{|f(x)|}{(-1)^{l-k}\dbinom{|f(x)|-1}{l-1}\dbinom{l-1}{k-1}}}\\&=\sum\limits_{x\in S}{x\sum\limits_{l=1}^{|f(x)|}{(-1)^{l-k}\dbinom {|f(x)|-1}{k-1}\dbinom{|f(x)|-k}{l-k}}}\\&=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}\sum\limits_{l=1} ^{|f(x)|}{(-1)^{l-k}\dbinom {|f(x)|-k}{l-k}}}\end{aligned}\)
易知 \(|f(x)|<k\) 时无贡献。
\(\begin{aligned}&=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}\sum\limits_{l=0}^{|f(x)|-k}(-1)^l\dbinom{|f(x)|-k}{l}}\\&=\sum\limits_{x\in S}{x\dbinom {|f(x)|-1}{k-1}[|f(x)|=k]}=\max\limits_{k_{th}}{S}\end{aligned}\)
容斥原理例题
-
硬币购物
共有 4 种硬币。面值分别为 \(c_1,c_2,c_3,c_4\)。
某人去商店买东西,去了 \(n\) 次,对于每次购买,他带了 \(d_i\) 枚 \(i\) 种硬币,想购买 \(s\) 的价值的东西。请问每次有多少种付款方法。
sol:
设 \(A_1,A_2,A_3,A_4\) 分别为每种硬币取超限的方案数。
则答案为总情况数减去 \(A_1\cup A_2\cup A_3\cup A_4\)。
显然,总情况数做一个完全背包即可求出。
现在考虑第 1 种硬币超限的方案数,它其实相当于先取 \(d_1+1\) 个第 1 种硬币,再对剩下的硬币做一次完全背包。
同理,可以用以上方法算出所有方案数,此题得解。
-
卡农
在集合 \(S=\{1,2,\cdots,n\}\) 中,选出 \(m\) 个无序的互不相同的非空子集,使得每个元素的出现次数均为偶数,求选择方案数。
sol:
设 \(f_i\) 表示选出 \(i\) 个集合满足条件的方案数。
先考虑出现次数为偶数的限制:前 \(i-1\) 个集合确定了,第 \(i\) 个集合也确定了,方案数为 \((2^n-1)^{\underline{i-1}}\)。
再减去不满足另外两个限制的方案数:
-
第 \(i\) 个集合为空集。此时前 \(i-1\) 个集合构成合法方案,数量为 \(f_{i-1}\)。
-
第 \(i\) 个集合和第 \(j\) 个集合相同。此时剩下 \(i-2\) 个集合构成合法方案,且 \(j\) 有 \(i-1\) 种选法,集合 \(i\) 有 \(2^n-1-(i-2)\) 种选法。故数量为 \(f_{i-2}(i-1)(2^n-i+1)\)。
综上,递推式为 \(f_i=(2^n-1)^{\underline{i-1}}-f_{i-1}-f_{i-2}(i-1)(2^n-i+1)\)。
-
如何正确地排序
给定数列 \(a,b,c\),求 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n\max\{a_i+a_j,b_i+b_j,c_i+c_j\}-\min\{a_i+a_j,b_i+b_j,c_i+c_j\}\)。
sol:
考虑 min-max 容斥。
\(\begin{aligned}\max\{a_i+a_j,b_i+b_j,c_i+c_j\}-\min\{a_i+a_j,b_i+b_j,c_i+c_j\}\end{aligned}\)
\(\begin{aligned}=a_i+a_j+b_i+b_j+c_i+c_j-\min\{a_i+a_j,b_i+b_j\}-\min\{a_i+a_j,c_i+c_j\}-\min\{b_i+b_j,c_i+c_j\}\end{aligned}\)
考虑如何求出 \(\sum\limits_{i=1}^n\sum\limits_{j=1}^n-\min\{a_i+a_j,b_i+b_j\}\)。
把式子变成 \((a_i+a_j)[a_i+a_j<b_i+b_j]\),移一下项可得:\((a_i+a_j)[a_i-b_i<b_j-a_j]\),发现就是一个逆序对,树状数组或二维偏序即可。
-
Card Collector
给 \(n\) 个元素,每次随机选择一个,有 \(p_i\) 的概率选择第 \(i\) 个,问所有元素都被选择的期望时间。
sol1:
假设全集为 \(S\),则答案为 \(E(\max(S))\)。
考虑 min-max 容斥:
而 \(E(\min(T))\) 第一次抽出集合 \(T\) 中元素的期望时间,显然是 \(\frac{1}{\sum\limits_{i\in S}p_i}\)。(概率是 \(\sum\limits_{i\in S}p_i\),则期望是它的倒数,可证明)
sol2:
设 \(f_S\) 表示现在已经有了集合 \(S\) 中的元素,集齐全部的时间期望。
则 \(f_{S}=1+(\sum\limits_{i\in S}p_i)f_{S}+(\sum\limits_{i\notin S}p_i)f_{S+\{i\}}\)。
化简得 \(f_{S}=\frac{1+(\sum\limits_{i\notin S}p_i)f_{S+\{i\}}}{1-\sum\limits_{i\in S}p_i}\),\(\operatorname{dp}\) 即可。
-
重返现世
给 \(n\) 个元素,每次随机选择一个,有 \(\frac{p_i}{m}\) 的概率选择第 \(i\) 个,问第一次有 \(k\) 个元素被选择的期望时间。
sol:
设全集为 \(S\),显然答案为 \(E(\max\limits_{kth}(S))\)。
由 min-max 容斥:
\(\begin{aligned}E(\max\limits_{kth}(S))&=\sum\limits_{T\subset S}(-1)^{|T|-k}\binom{|T|-1}{k-1}E(\min(S))\\&=\sum\limits_{T\subset S}(-1)^{|T|-k}\binom{|T|-1}{k-1}\frac{m}{\sum\limits_{i\in T}p_i}\end{aligned}\)
转为枚举 \(\frac{m}{\sum\limits_{i\in T}p_i}\),则答案为:
设 \(\frac{m}{h}\) 后面一部分为 \(f_{n,h}\),则答案为 \(\sum\limits_{h=0}^m\frac{m}{h}\cdot f_{n,h}\)。
考虑转移,有两种情况:
不选 \(n\),则贡献为 \(f_{n-1,h}\)。
选 \(n\),对于 \(i,j\) 这两维,必定分别由 \(i-1,j-p_i\) 转移而来,但如果直接转移,转移后的所有 \(|T|\) 都比转移前大 \(1\)(塞了个 \(p_i\) 进去),考虑其影响:
-
式子里的 \((-1)^{|T|-k}\) 正负相反,所以应该给转移的 \(f\) 取相反数。
-
观察 \(C_{|T|-1}^{k-1}\),如果 \(|T|\) 大 1,它可以拆成 \(C_{|T|-1}^{k-1} + C_{|T|-1}^{k-2}\)。
-
\(C_{|T|-1}^{k-1}\) 的 \(k\) 不变,由于 \(|T|\) 变了 1,所以 \(f_{k,i-1,j-p_i}\) 对 \(f_{k,i,j}\) 有 \(-f_{k,i-1,j-p_i}\) 的贡献。
-
\(C_{|T|-1}^{k-2}\) 的 \(k\) 小 \(1\),\(|T|\) 也变了 \(1\),负负得正,\(f_{k-1,i-1,j-p_i}\) 对 \(f_{k-1,i,j}\) 有 \(f_{k-1,i-1,j-p_i}\) 的贡献。
-
把它们综合起来,可得 \(f_{i,j,k}=f_{i-1,j,k}-f_{i-1,j-p_i,k}+f_{i-1,j-p_i,k-1}\)。
\(O(nmk)\) 算出 \(f\) 数组,答案就能求了。

浙公网安备 33010602011771号