容斥原理
\[\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)
\]
二项式反演相关
- 我们可以用上一题的思路来做
- 既然是求恰好,那么我们就构造 \(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)\) 会比较好求
对于一个集合第一个出现的期望步数,就是概率和再导过来,因为系数符合几何概率分布
- 期望走几步走完集合 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)\)
- 首先可以用 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)\) ,空间拿滚动数组做
- 这个东西明显套 Min-Max 容斥,改成求 Min
- 对于一个集合的 Min 那不就是只要能对这个集合的做贡献的数的概率和倒过来
- 你会发现这就是个子集前缀和的形式,用 FWT 正变化一下就可以得到之后的序列了
- 总的复杂度为 \(O(2^nn)-O(2^n)\)