容斥原理

\[\left| \bigcup_{i=1}^n S_j\right|=\sum_{m=1}^n(-1)^{m+1} \left| \sum_{a_i<a_{i+1}}\bigcap_{i=1}^m S_{a_i} \right| \]

\[\left| \bigcap_{i=1}^n S_i \right| = \left| U \right|-\left|\bigcup_{i=1}^n \overline{S_i} \right| \]

  • 全集减去补集的并就是集合的交

问题模型

  • 具有属性/限制条件
  • 我们可以对于每个属性建立一个集合,补集就是不满足这个属性的集合

不定方程非负整数解计数

给出不定方程 \(\sum_{i=1}^n x_i=m\)\(n\) 个限制条件 \(x_i\leq b_i\) ,求非负整数解

  • 属性有 \(n\) 个,分别是 \(x_i\leq b_i\)
  • 考虑容斥,全集是 \(\binom{m+n-1}{n-1}\) ,现在目标是求出补集的并集,这个东西可以容斥
  • 考虑 $ \left| \sum_{a_i<a_{i+1}}\bigcap_{i=1}^m S_{a_i} \right|$ 这个东西怎么求,也就是一些补集的并的大小
  • 交集表示 \(x_i\geq b_i+1\) 的解的数,而交集表示同时满足这个条件,因此在这个不定方程中有些有下限制,有的没有
  • 因为都是非负整数,所以我们直接将下标减去,那么每个变量的下界就都是 0 ,因此对于这个交集的不定方程形式就是

\[\sum_{i=1}^n x_i=m-\sum_{i=1}^k (b_{a_i}+1) \]

  • 这个显然是可以用组合数来表示的
  • 这个长度为 \(k\)\(a\) 数组其实就是在枚举子集

HAOI2008 硬币购物

  • 4 种面值,第 \(i\) 种面值是 \(C_i\) 。每次询问给出每个硬币的数量 \(D_i\) 和一个价格 \(S\) ,问付款方案数
  • 每次背包不太行
  • 实际上就是在求 \(\sum_{i=1}^4 C_ix_i=S,x_i\leq D_i\) 的非负整数解的个数
  • 那么每次都像上面一样容斥一下,因为数量很少,所以枚举子集是足够的

错位排列的计数

  • 属性就是 \(i\neq P_i\)
  • 全集就是阶乘,套用上面的公式,其实就是要求补集的交集的大小
  • 此处的补集是 \(P_i=i\) 的方案集合。
  • 那么补集的交集(假设有 \(k\) 个)的大小就是 \((n-k)!\)
  • 那么整个式子就出来了,最终的式子是 \(n!\sum_{k=0}^n\frac{-1^k}{k!}\)

完全图子图染色问题

一个 \(n\) 个节点完全图,对于一个边集 \(S\)\(F(S)\) 为用 \(m\) 个颜色去染的方案数

染色的规则是相邻的颜色必须同色

如果 \(|S|\) 是奇数,那么 A 得分,否则 B 得分

问 A 和 B 的差值

  • \(Ans=\sum_{S\subseteq E} (-1)^{|S|-1} F(S)\)
  • 考虑将每一条边两边的端点的颜色相同作为一种属性,假设集合为 \(Q\)
  • 对于每条边我们映射成一个数字,假设是一组边集是集合 \(K=\{k_1,k_2,..\}\),假设边集为 \(T=\{1,2,...,n(n+1)/2\}\)
  • 那么 \(Ans=\sum_{K\subseteq T} F(S)\)
  • 对于 \(F(S)=\left| \bigcap_{i=1}^k Q_i\right|\)
  • 那么 \(Ans=\sum_{S\subseteq E}(-1)^{|S|-1}\left| \bigcap_{i=1}^k Q_i\right|\)
  • 这个东西不就是 \(Ans=\left|\bigcup_{i=1}^T Q_i\right|\)
  • 那不就是只要有一对端点颜色相同就可以了
  • 那么正常的容斥就可以了

容斥原理求最大公约数为 \(k\) 的数对个数

\(1\leq x,y\leq n\)\(f(k)\) 表示最大公约数为 \(k\) 的有序对数,求 \(f(1)\)\(f(n)\)

  • \(Ans=公约数为 \space k \space 的个数 - 公约数为 \space k\space 的倍数的个数\)
  • 而公约数为 \(k\) 的倍数的个数就等于最大公约数为 \(k\) 的倍数的有序对数的和
  • 所以 \(f(k)=\lfloor \frac{n}{k}\rfloor ^2 \times \sum_{i=2}^{i*k<n} f(i*k)\)
  • \(k>n/2\) ,可以直接算,因为后面不可能出现 \(k\) 的 2 倍在 \(n\) 以内
  • 所以我们可以倒推

容斥原理推导欧拉函数

  • \(\varphi(n)=\sum_{d|n} [\gcd(d,n)]=1\) ,先将 \(n\) 因式分解
  • 我们设属性为 \(p_i\nmid n\) 为一种属性,假设集合为为 \(S\)
  • 那么就是求 \(\left|\bigcap_{i=1}^k S_i \right|\)
  • 这个东西的全集就是 \(n\) ,那么其实就是要求补集的交,显然一个补集的交集就是同时是几个质数的倍数的个数,就是 \(\frac{n}{\Pi p_i}\)
  • 所以才有最后的欧拉函数的一个通式

\[\varphi(n)=n(1-\frac{1}{p_1})...(1-\frac{1}{p_k}) \]

容斥原理一般化

\[f(S)=\sum_{T\subseteq S} g(T) \]

那么

\[g(S)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(T) \]

同理

\[f(T)=\sum_{T\subseteq S} g(S) \]

那么

\[g(T)=\sum_{T\subseteq S}(-1)^{|S|-|T|}f(S) \]

  • 我更愿叫它 "容斥反演"

DAG 计数

\(n\) 个点带标号的有向无环图进行计数,对 \(10^9+7\) 取模,\(n \leq 5\times 10^3\)

  • 因为每个 DAG 的入度/出度为 0 的节点是固定的,也就是特殊点
  • 我们考虑枚举一个,这里枚举入度
  • 思考入度为 0 的点个数大于等于 \(j\) 的方案数为先选择 \(j\) 个,这些点和剩下的点随便连边
  • \(g(i)=\binom{n}{i}2^{(n-i)i}F(n-i),F(n-i) 为大小为 (n-i) 的 DAG 方案数\)
  • 但是我们发现这样会发生重复,并不是严格意义上的大于等于 \(j\) 的方案数
  • 但是事实上 \(g(i)=\sum_{j=i}^{n} \binom{j}{i} f(j)\)\(f\) 为恰好的方案数
  • 那么反演过来就是 \(f(i)=\sum_{j=i}^n(-1)^{j-i}\binom{j}{i}g(j)\)
  • 最后的 \(F(n)=\sum_{i=1}^n f(i)\)
  • 我们将每个 \(f\) 展开,然后发现最后 \(g(i)\) 的系数为 \((-1)^{i-1}\binom{i}{1}+(-1)^{i}\binom{i}{2}+....\)
  • 通过组合公式 \(\sum_{i=0}^n \binom{n}{i}=[n=1]\) ,可以具体求出每个的系数

\[F(n)=\sum_{i=1}^n(-1)^{i-1}\binom{n}{i}2^{(n-i)i}F(n-i) \]

二项式反演相关

P2167 [SDOI2009]Bill的挑战

  • 我们可以用上一题的思路来做
  • 既然是求恰好,那么我们就构造 \(f(k)=\sum_{i=k}^n \binom{i}{k} g(i)\)
  • 而这个题也很好构造这个东西,取所有长度为 \(k\) 的子集,算出来的字符串的和就是 \(f\)
  • 然后反演一下就可以了,总的复杂度为 \(O(2^{15}\times 50+n)-O(n)\)

全序关系

对于任意 \(a,b,c\in X\) 都成立

  • 反对称性:若 \(a\leq b,b\leq a\) 那么 \(a=b\)
  • 传递性:若 \(a\leq b,b\leq c\) ,那么 \(a\leq c\)
  • 完全性:\(a\leq b\)\(a\geq b\)

Min-Max 容斥

  • 对于满足全序关系并且其中元素满足可加减性的序列 \(\{x_i\}\) ,设其长度为 \(n\) ,并设 \(S=\{1,2,3,..,n\}\),则有

\[\max_{i\in S} x_i=\sum_{T\subseteq S} (-1)^{|T|-1} \min_{j\in T} x_j \]

\[\min_{i\in S}x_i=\sum_{T\subseteq S} (-1)^{|T|-1}\max_{j\in T}x_j \]

  • 对于期望仍然是有效的,因为满足全序且可加减

\[E(\max_{i\in S} x_i)=\sum_{T\subseteq S} (-1)^{|T|-1} E(\min_{j\in T} x_j) \]

\[E(\min_{i\in S}x_i)=\sum_{T\subseteq S} (-1)^{|T|-1}E(\max_{j\in T}x_j) \]

  • 注意到这里指的是期望的最大最小值,不是括号里的
  • 更强的

\[kth\max_{i\in S} x_i=\sum_{T\subseteq S} (-1)^{|T|-k}\binom{|T|-1}{k-1} \min_{j\in T} x_j \]

\[kth\min_{i\in S} x_i=\sum_{T\subseteq S} (-1)^{|T|-k}\binom{|T|-1}{k-1} \max_{j\in T} x_j \]

  • 这个同样可以套上期望
  • 根据 \(\min-\max\) 容斥还可以知道

\[\underset{i\in S}{\operatorname{lcm}} x_i=\prod_{T\subseteq S} (\gcd_{j\in T} x_j)^{(-1)^{|T|-1}} \]

  • 这里的 \(\operatorname{lcm},\gcd,a^1,a^{-1}\) 分别代表最大值,最小值,加,减
  • 具体的可以想象成对于每个质因数选出一个最大值,最后相乘
  • 而最大值容斥的时候最小幂次就可以表现成所有数的 \(\gcd\)

一般的,我们一般会先将题目转换成求 \(E(\max )\) 的形式,然后再用 Min-Max 容斥,因为 \(E(\min)\) 会比较好求

对于一个集合第一个出现的期望步数,就是概率和再导过来,因为系数符合几何概率分布

P5643 [PKUWC2018]随机游走

  • 期望走几步走完集合 S ,其实就是求集合 S 中走到的步数期望值最大的,那么用 Min-Max 转换成求最小
  • 那么就可以反过来求集合 T 到 x 走到的期望
  • 直接求是 \(n^3\) ,因为是在图上,要高斯消元
  • 但是这里很特殊是棵树,所以我们完全可以以特殊的解法来解决
  • 我们以 \(x\) 为根,树上的每个节点的期望一定可以用形如 \(Af_{fa_i}+B\) 的形式表达,也就是用父亲来表达
  • 那么最后求到根,它的期望就是 \(B\) ,因为没有父亲
  • 可以预处理好每个集合对应的值,那么
  • 那么现在的复杂度就是 \(O(2^nn)-O(q2^n)\)
  • 事实上我们发现这个式子其实就是一个子集前缀,那么用 FWT 或运算正变换一下,得到的 \(FWT\) 数组就是所有子集的答案
  • 那么复杂度就可以做到 \(O(2^nn+n\log n)-O(q)\)

P4707 重返现世

  • 首先可以用 Min-Max 转换成对于一个集合求 Min
  • 一个集合的一个元素取到的概率为 p ,那么期望次数就是 \(\frac{1}{p}\)
  • 但是这里的 \(n\) 太大了,肯定没办法枚举子集
  • 观察到每个子集的贡献和 \(|T|\)\(\sum p\) 有关
  • 那么设 \(dp_{i,j,k}\) 表示前 \(i\) 个集合大小为 \(j\)\(\sum p =k\) 的方案数
  • 然而你会发现这个是 \(O(nm^2)\) ,需要优化
  • 考虑将这个 \(|T|\) 系数优化掉,\(\binom{n}{m}=\binom{n-1}{m-1}+\binom{n-1}{m}\) ,我们利用这个拆式子,但是这个 \(k\) 就不固定了
  • 观察到题目中 \(|n-k|\leq 10\) ,而我们一开始将 \(k=n-k+1\),所以 \(k\leq 10\)
  • 所以这个 \(k\) 是很小的,所以总的复杂度就为 \(O(nmk)\) ,空间拿滚动数组做

P3175 [HAOI2015]按位或

  • 这个东西明显套 Min-Max 容斥,改成求 Min
  • 对于一个集合的 Min 那不就是只要能对这个集合的做贡献的数的概率和倒过来
  • 你会发现这就是个子集前缀和的形式,用 FWT 正变化一下就可以得到之后的序列了
  • 总的复杂度为 \(O(2^nn)-O(2^n)\)
posted @ 2022-06-12 14:22  Kzos_017  阅读(91)  评论(0编辑  收藏  举报