容斥与反演技巧(二)
年 更 大 作
FJOI2017 矩阵填数
\(\max =v\) 拆成 \(\le v\) 和存在一个 \(=v\),对第二个条件容斥发现变成 \(<v\),离散化后对每个点求出上界直接算。复杂度 \(O(n^32^n)\)。
CF449D
相当于每一位上至少有一个 \(0\)。钦定某些位上全是 \(1\),发现只需要做高维后缀和。
FMT 即可。复杂度 \(O(a_i\log a_i)\)。当然也有手拆 FMT 摁做的方法。
ZJOI2016 小星星
\(f(u,j,S)\) 表示 \(u\) 为根的子树,恰好用 \(S\) 以内的这些数,\(p_u=j\) 的方案数。
你可以直接在转移的时候做集合不交并卷积,但是我们可以容斥:排列看作所有数至少出现一次,钦定某些元素不能出现,然后对每个集合 \(S\) 做一遍 \(O(n^3)\) 树形 DP(即 \(f(u,j)\) 表示 \(u\) 子树内,且 \(p_u=j\) 的方案数,但这里要求 \(j\not\in S\)),设得到的值是 \(g(S)\),则答案为 \(\sum(-1)^{|S|}g(S)\)。
时间复杂度 \(O(n^32^n)\),空间复杂度 \(O(n^2)\)。
集合不相等容斥
计数符合以下条件的 \(a\) 的数量:
- \(\forall i,a_i\in S_i\)。
- \(\forall i\neq j,a_i\neq a_j\)。
考虑建出 \(n\) 点的图,若 \(a_i=a_j\) 则连无向边 \((i,j)\)。那么互不相同相当于图中一条边都不能连。
设 \(C(E)\subseteq 2^V\) 为连上边集 \(E\) 后的连通块集合,\(F(P)\) 表示连通块形态为 \(P\) 时的答案(\(P\subseteq 2^V\)),则答案为
不难发现重点在计算后面那一项。显然各个连通块独立,只需要对每个连通块 \(S\in P\),求出所有使 \(S\) 以内点集联通的边集 \(E\) 的 \((-1)^{|E|}\) 之和。设 \(f_k\) 表示 \(k\) 个点的方案数,发现没有联通限制的时候答案是 \([k=1]\),即 \((\exp f)_k=[k=1]\),取 \(\ln\) 得到 \(f_k=(-1)^{k-1}(k-1)!\),因此
具体来说,考虑怎么算 \(f\):较好理解的方式是采用容斥,用随意连的贡献和减去不连通的贡献和。由于随意连的时候贡献和为 \([k=1]\),不连通时考虑 \(1\) 所在连通块,有
\[f_i=[i=1]-\sum_{j=1}^{i-1}\binom{i-1}{j-1}f_j[i-j=1]=-(i-1)f_{i-1} \]再结合 \(f_1=1\),自然有 \(f_k=(k-1)!(-1)^{k-1}\)。当然,你可以发现上述过程就是做了一次 \(\ln\)。
集合幂级数优化 exp 即可做到 \(O(n^22^n)\)。
ABC236Ex
\(F(P)=\prod_{S\in P}\lfloor\frac{M}{\text{lcm}(S)}\rfloor\) 容易计算。
本题中 \(F(P)\) 对各个连通块独立,某些题目中则不满足这个性质。
集训队互测 2012 calc
把元素划分为相等集合之后,有 \(F(P)=\prod_{S\in P}\sum_{i=1}^ki^{|S|}\)。
接下来我们简记为 \(F_x=(-1)^{x-1}(x-1)!\sum_{i=1}^ki^x\)。考虑 \(F\) 的 EGF,只需要求 \([x^n]\text{exp }F\)。
由于 \(n\) 比较小,暴力算 \(\text{exp}\) 就是 \(O(n^2)\)。
算自然数幂可以预处理第二类斯特林数后 \(O(n^2)\) 计算,总的复杂度为 \(O(n^2)\)。
ABC288Ex
如果没有不降的限制,可以数位 DP 在 \(O(N^3\log M)\) 的时间内求出 \(1,2,\cdots,N\) 个数时的答案。
现在考虑怎么处理不降。考虑钦定某些位置是 \(=\),某些位置是 \(<\)。
发现相当于对这 \(N\) 个数进行划分,划分出的集合内部两两相同,不同集合中的数两两不同。
从每个奇数大小的集合中选一个代表元,考虑怎么算 \(g(i)\) 表示 \(i\) 个数两两不同的方案数。
使用集合不相等容斥;发现这个异或和的限制没办法把连通块拆开,但是偶数大小的连通块方案数直接就是 \(M+1\),奇数大小的连通块若有 \(x\) 个,方案数是 \(F(x)\),其中 \(F(x)\) 表示 \(x\) 个 \(\le M\) 的数 \(\text{xor sum}=X\) 的方案数。重新设 \(h(x,y)\) 表示 \(x\) 个数划分成若干连通块,其中 \(y\) 个大小为奇数的容斥系数和;转移类似于求个 exp,枚举 \(1\) 所在连通块大小,有
可以做到 \(O(N^3)\)。那么 \(g(i)=\sum h(i,y)F(y)\)。最终相当于要在 \(g\) 的基础上,从 \([0,M]\) 中选出 \(2i\) 个数,且每个数的出现次数均为偶数。插板可得方案数 \(\binom{M+i}{i}\)。于是答案即
总的复杂度是 \(O(N^3\log M)\)。好像有 \(O(N\log M)\) 做法但是我不会/hsh
有标号连通无向图计数
- 容斥:用随便选的方法减去不连通的方法。随便选的方案是 \(g_n=2^{\frac{n(n-1)}{2}}\)对于不连通的方案,不连通的方案可以枚举 \(1\) 所在连通块大小 \(j\),有 \(f_i=g_i-\sum_{j=1}^{i-1}\binom{i-1}{j-1}f_jg_{i-j}\)。直接做复杂度就是 \(O(n^2)\),发现形式是分治 NTT 可以简单做到 \(O(n\log^2n)\)。
- 实际上可以发现 \(\exp f=g\Rightarrow f=\ln g\),求 \(\ln\) 就可以直接 \(O(n\log n)\) 了。
有标号(弱连通) DAG 计数
明确一下:有标号 DAG 计数指的是,求有多少个 \(n\) 点若干条有向边的图,使得他是一个 DAG。
发现 DAG 这个东西中度数为 \(0\) 的点比较重要。设 \(f_i\) 为 \(i\) 个点的答案,考虑枚举度数为 \(0\) 的点有 \(j\) 个,发现还得钦定剩下的度数都不为 \(0\),比较难受。
容斥一下,钦定某 \(j\) 个度数为 \(0\),他们向剩下的点自由连边,方案数为 \(2^{j(i-j)}\),因此钦定 \(j\) 个点度数为 \(0\) 的方案数就是 \(\binom{i}{j}2^{j(i-j)}f_{i-j}\),把这个做二项式反演就是恰好 \(j\) 个度数为 \(0\) 的方案数;求和就可以得到真正的 \(f_i\)。
推一下式子:
直接做可以 \(O(n^2)\),注意到 \(xy=\binom{x+y}{2}-\binom{x}{2 }-\binom{y}{2}\),因此
这样可以拆成卷积的形式,分治 NTT 做到 \(O(n\log ^2n)\)。
如果要求弱连通,只需要再做一次 \(\ln\)。
不经过限制点路径计数
模型大概长成这样:给定一个 DAG,计数从起点 \(1\) 到终点 \(n\) 的路径, 满足不经过一些限制点。一般而言,DAG 上从一个点出发无限制走到另一个点的方案数都是好算的。
考虑钦定走过集合 \(S\) 以内的限制点 \(\{x_1,\cdots,x_k\}\)(\(k=|S|\)),容斥系数为 \((-1)^{k}\),方案数为
其中 \(w(u,v)\) 表示 \(u\to v\) 的路径个数。
肯定不能暴力枚举集合对吧,考虑带着容斥系数 DP,\(f(u)\) 表示 \(S\) 中拓扑序最大的点恰好为 \(u\) 的这些 \(S\) 的 \((-1)^{|S|}c(S)\) 之和,那么转移就是 \(f(u)=w(1,u)-\sum_{v}f(v)\times w(v,u)\)。
当然也有直观的理解方式:\(f(u)\) 表示第一次走到的限制点恰好是 \(u\) 的方案数,转移用随便走的方案数减去第一次走到的限制点不是 \(u\) 的方案数。如果第一次走到的限制点不是 \(u\),那么枚举这个第一次走到的限制点 \(v\),发现方案数就是 \(f(v)\times w(v,u)\)。
LOJ575 不等关系
容斥,钦定某些大于号变成小于号,剩下的位置随便;发现相当于把 \(1\cdots n\) 划分成若干集合,第 \(i\) 个集合大小为 \(x_i\) 的方案数,方案数可以简单求出,即 \(\binom{n}{x_1\ \ x_2\ \ \cdots\ \ x_k}\)。
发现相当于从大于号中提取一个子序列,考虑带着容斥系数 DP,有
写成分治 NTT 的形式即可做到 \(O(n\log ^2n)\)。
联合省选 2022 卡牌
做过寿司晚宴就容易想到根号分治,对 \(\le \sqrt{v}\) 的质因子状压,同时对每个 \(>\sqrt{v}\) 的质因子 \(p\) 存一个 \(f(p,S)\) 表示只考虑 \(\ge \sqrt{v}\) 的质因子恰好是 \(p\) 的这些数,他们小的那些质因子的并集为 \(S\) 的方案数。
对于询问集合 \(S\),考虑钦定某个子集 \(T\subseteq S\),令 \(T\) 内质因子都不被包含,则容斥系数为 \((-1)^{|T|}\);接下来枚举每个大的质因子,如果这个质因子被钦定了就令 \(\text{ans}\leftarrow \text{ans}\times (f({p,S})-1)\),否则令 \(\text{ans}\leftarrow \text{ans}\times f({p,S})\)。\(f\) 容易预处理,总复杂度 \(O((m+\sum c_i)2^r+v\times r2^r)\),其中 \(r=\pi(\sqrt{v})\) 即小质因子的个数。