容斥相关
二项式反演
基本定义
设 \(f(n)\) 表示在恰好选择 \(n\) 个不同元素满足某种条件的方案数,\(g(n)\) 表示在 \(n\) 个不同元素选择任意个满足该条件的方案数。那么对于 \(f\) 和 \(g\) 的关系有下式。
但是现在的问题是我们可以快速计算 \(g\),而我们要求得 \(f\)。
我们发现上式和二项式定理有很大的相似性,我们不妨从这方面入手。
这是二项式定理的基本形式。现在我们来试试能不能用 \((x+1)^i\) 来表示 \(x^n\)。
然后换元,令 \(f(n)=x^n,g(n)=(x+1)^n\),我们得到了一组二项式反演的基本形式。
当然,我们现在只说明了对于特定形式该定理成立,现在我们要进一步证明其对于任意 \(f,g\) 均成立。
考虑将下式代入上式并做化简,我们可以得到如下式子。
而由于后面的式子仅在 \(j=n\) 时为 \(1\),故原式可进一步化简为下式。
证毕。
二项式反演还有更常见的表示形式。
例题
P1595
考虑二项式反演,令 \(f(n)\) 表示恰好有 \(i\) 个人位置站错的方案数,\(g(n)\) 表示 \(n\) 个人任意排列的方案数,显然有 \(g(n)=n!\)。然后套二项式反演即可得到 \(f(n)=\sum\limits_{i=0}^n\dbinom{n}{i}(-1)^{n-i}n!\),容易线性计算。
染色问题
给 \(n\) 个格子染 \(k\) 种颜色,每种颜色出现至少一次,相邻格子颜色互不相同,求方案数。
设 \(f(k)\) 表示用 \(k\) 种颜色每种至少出现一次的方案数,\(g(k)\) 表示用 \(k\) 种颜色不限制出现次数的总方案数,显然有 \(g(k)=k(k-1)^{n-1}\),且 \(g(k)=\sum\limits_{i=0}^k \dbinom{k}{i}f(i)\)。套二项式反演,\(f(k)=\sum\limits_{i=0}^k\dbinom{k}{i}(-1)^{k-i}g(i)\)。
P4491
考虑二项式反演。首先考虑钦定 \(i\) 个颜色出现了恰好 \(S\) 次,剩下的颜色任选的方案数,令其为 \(g(i)\),分成两部分考虑,首先考虑没被钦定的颜色,相当于是 \(m-i\) 种颜色随意填到 \(n-iS\) 个空位中,方案数是 \((m-i)^{n-iS}\),然后考虑钦定的颜色,首先要在所有颜色中选择 \(i\) 个,那么是 \(\dbinom{m}{i}\),然后在集合里填上 \(n-iS\) 个占位颜色,那么变成了一个长度为 \(n\) 的可重排列计数,那么方案数是 \(\dfrac{n!}{(S!)^i(n-iS)!}\)。整理一下即可得到 \(g(i)\) 的表达式。
然后考虑二项式反演,设 \(f(i)\) 为恰好 \(i\) 种的方案数。
那么有 \(g(i)=\sum\limits_{j=i} \dbinom{j}{i}f(j)\)。上二项式反演,那么有 \(f(i)=\sum\limits_{j=i}\dbinom{j}{i}(-1)^{j-i}g(j)\)。
拆开组合数,然后合并并化简,即可得到下式。
很明显的卷积形式,对右式 NTT 即可。
Min-Max 容斥
基本定义
下文中令一个集合 \(S\) 中的最小值为 \(\min(S)\),最大值为 \(\max(S)\),\(k\) 大值为 \(\max(k,S)\),\(k\) 小值为 \(\min(k,S)\)。
假设我们现在有一个全集 \(U=\{a_1,a_2,\cdots,a_n\}\)。且我们能快速的对于一个子集 \(S\subseteq U\) 求出 \(\min(S)\)。现在我们要对一个集合 \(S\subseteq U\),求出 \(\max(S)\)。Min-Max 容斥能够帮助我们解决这一类问题。
oi-wiki 给了一个很巧妙的推导,故记录在下面。
我们考虑将这种怪异的容斥向正常的容斥进行映射。考虑构造函数 \(f:A_x\rightarrow \{1,2,\cdots,x\}\),其中 \(A_x\) 为 \(U\) 中的第 \(k\) 大值。显然上述映射是一个双射,且有 \(f(\min(x,y))=f(x)\cap f(y),f(\max(x,y))=f(x)\cup f(y)\)。
注意到每个集合可以用其大小区分,那么对集合大小进行容斥,我们有如下式子。
那么我们再把集合映射回数字,故得到了 Min-Max 容斥的基本形式。
同时也可以写出将 \(\min(S)\) 容斥为 \(\max(S)\) 的形式。
不加证明的,Min-Max 容斥在期望意义下也成立。
Min-Max 容斥还有更强的形式,即把 \(k\) 大值容斥为最小值。
受上面的启发,我们仍然试图将其写为一个和式\(\max(k,S)=\sum\limits_{T\subseteq S} f(T)\min(T)\) 的形式。其中 \(f(T)\) 是一个和 \(T\) 相关的函数。我们的目标即为推出容斥系数。
考虑对于第 \(x\) 小,其对答案有贡献是什么情况,即从集合中选出若干个不小于 \(x\) 的数,不选小于 \(x\) 的数,后者共有 \(x-1\) 个。设其贡献为 \(v_x\),则有下式。
那么我们要求 \(v_x=[x=n-k+1]\),也就是说满足下式。
换元后上二项式反演,即可得到下式。
整理一下,即可得到 \(f(x)=\dbinom{x-1}{k-1}(-1)^{x-k}\)。带回原式,我们即可得到扩展 Min-Max 反演的基本形式。
这个式子在期望意义下也成立,即有下式。
而我们可以通过类背包的 dp 等手段处理出后面的东西,这就是 Min-Max 容斥的威力!
例题
P4707
这个猛。感觉难点在于想到可以做 Min-Max 容斥,后面 dp 设计状态和拆组合数的那一步也很精彩。
考虑此时的 \(\min(T)\) 的实际含义,那么应该是 \(T\) 中的所有原料出现一种的期望时间,而题目所求即为 \(\min(k,U)\),其中 \(U\) 为全集,稍微转化一下,令 \(k\leftarrow n-k+1\) 变成 \(\max(k,U)\)。
注意到我们实际上是可以快速求 \(\min(T)\) 的,设 \(T=\{a_1,a_2,\cdots,a_t\}\),那么做一次的概率 \(P(\min(T))=\dfrac{\sum\limits_{x\in T} p_x}{m}\),然后得到 \(E(\min(T))=\dfrac{m}{\sum\limits_{x\in T} p_x}\)。
还记得那个式子在期望意义下成立吗?那么我们套上 Min-Max 反演,那么有下面的式子。
考虑 dp。观察原式子中哪些东西需要塞到状态里。注意到一个有趣的事情是对于固定的集合大小,其前面的系数总是固定的,所以我们可以枚举集合大小后把后面那一坨组合数和系数丢到前面,最后乘回去。所以上来有一个 naive 的想法是设 \(f(i,j,k)\) 表示当前考虑到第 \(i\) 个数,\(\vert T\vert=j\),\(\sum\limits_{x\in T} p_x=k\) 的方案数,有转移方程 \(f(i,j,k)=f(i-1,j,k)+f(i-1,j-1,k-p_i)\)。这样得到了一个 \(O(n^2m)\) 的做法。
考虑优化状态。注意到 \(i,k\) 两维必须记录,我们考虑把 \(j\) 压掉,也就是说,我们要对 \(\sum\limits_{T\subseteq U} \dbinom{\vert T\vert-1}{k-1}(-1)^{\vert T\vert-k}\) 这样子的系数求和。
继续考虑转移,延续上面的想法,我们试图构建一个 \(f(i,k)=af(i-1,k)+bf(i-1,k-p_i)\) 式的转移方程。第一部分显然有 \(a=1\),接下来考虑第二部分。
考虑把一个数加入集合以后变成了什么,首先一定会让系数乘上 \(-1\),然后考虑组合数部分,会变成 \(\dbinom{\vert T\vert}{k-1}\)。然后怎么做?\(\dbinom{\vert T\vert-1}{k-1}\rightarrow \dbinom{\vert T\vert}{k-1}\) 这种东西?组合数递推!
那么我们再加一维 \(j\),含义为上面式子中的 \(k\) 是多少(注意不要跟上面的 \(\sum\limits_{x\in T} p_x=k\) 混淆),那么转移即为 \(f(i,j,k)=f(i-1,j,k)-f(i-1,j,k-p_i)+f(i-1,j-1,k-p_i)\)。注意最后那一项两个系数上的 \(-1\) 抵消。
初始状态是 \(f(0,x,0)=[x=0]-1\)。没有明确的意义,实际上可以看作是为了统计答案凑的系数。
单位根反演
基本定义
先摆式子。
在这里给一种比较优美的证明方式。
首先考虑 \(n\) 为 \(k\) 的约数,此时 \(ik\) 一定是 \(n\) 的倍数,所以 \(\omega^{ik}_n=\omega^{0}_n=1\),所以上式显然成立。
然后考虑 \(n\) 不为 \(k\) 的约数,令 \(d=\gcd(k,n)\),令 \(n'=\dfrac{n}{d},k'=\dfrac{k}{d}\)。根据单位根的性质,\(\omega^{ik}_n=\omega^{ik'}_{n'}\)。而此时显然有 \(n'\perp k'\),所以 \(\sum\limits_{i=0}^{n'-1}\omega_{n'}^{ik'}=0\),而求和到 \(n\) 相当于在式子前乘上 \(d\),故答案仍为 \(0\)。
例题
P5591
整除下取整我们是不好做的,我们考虑把整除拆掉,\(\lfloor\dfrac{i}{k}\rfloor=\dfrac{i-i\bmod k}{k}\)。
拆掉以后开始化简原式,不难得到下面的式子。
先把 \(\dfrac{1}{k}\) 拿掉,我们观察化简后的式子,分成两部分考虑。注意到第一部分拿掉 \(i\) 以后就是二项式定理,那么考虑把 \(i\) 放进组合数里。有组合恒等式 \(\dbinom{n}{i}i=\dfrac{n!}{(i-1)!(n-i)!}=n\dfrac{(n-1)!}{(i-1)!(n-i)!}=n\dbinom{n-1}{i-1}\),然后回代以后提取系数 \(np\),变成纯正二项式定理。然后考虑第二部分,我们试图将其搞成一个可以单位根反演的形式。
后面的东西显然可以单位根反演,同样拿掉系数,反演后化简可以得到下式。
后面的东西已经和 \(j\) 无关了,再次交换求和顺序把他化到前面去。
换元,令 \(x=\omega_k^{-t}\),那么原问题可以被归约为求解 \(f(k,x)=\sum\limits_{j=0}^{k-1} jx^j\)。这其实是一个经典的等比数列求和形式。
然后把 \((x-1)\) 除过去即可。注意到 \(x\) 是 \(n\) 次单位根,因此一定有 \(x^n=1\)。特判一下 \(x=1\) 即可,即可 \(O(k\log n)\) 解决。
斯特林反演
基本定义
先介绍斯特林数。
-
第一类斯特林数
第一类斯特林数 \(\begin{bmatrix}n\\m\end{bmatrix}\) 表示把 \(n\) 个不同的数分到 \(m\) 个互不区分的环的方案数。第一类斯特林数有递推式 \(\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\m\end{bmatrix}\),其意义分别为考虑是新建一个环还是插入一个原来的环中。
-
第二类斯特林数
第一类斯特林数 \(\begin{Bmatrix}n\\m\end{Bmatrix}\) 表示把 \(n\) 个不同的球分到 \(m\) 个互不区分的盒子,每个盒子至少一个球的方案数。第二类斯特林数有递推式 \(\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\begin{Bmatrix}n-1\\m\end{Bmatrix}\),其意义分别为考虑是新建一个盒子还是插入一个原来的盒子中。
第二类斯特林数有组合意义下的重要等式。
考虑令 \(g(m)\) 表示将 \(n\) 个球分到 \(m\) 个互不相同的盒子,不限制每个盒子是否为空的方案数,\(f(m)\) 为将 \(n\) 个球分到 \(m\) 个互不相同的盒子,限制每个盒子不为空的方案数,显然有 \(g(m)=m^n\),且 \(g(m)=\sum\limits_{i=0}^m \dbinom{m}{i}f(i)\)。然后显然可以二项式反演,整理后可得下式。
\[\begin{aligned} f(m)&=\sum\limits_{i=0}^m (-1)^{m-i}\dbinom{m}{i}g(i)\\ &=\sum\limits_{i=0}^m (-1)^{m-i}\dfrac{m!i^n}{i!(m-i)!} \end{aligned} \]
考虑到第二类斯特林数要求盒子互不区分,所以 \(\begin{Bmatrix}n\\m\end{Bmatrix}=\dfrac{f(m)}{m!}=\sum\limits_{i=0}^m (-1)^{m-i}\dfrac{i^n}{i!(m-i)!}\)。另外应用此公式可以将普通幂转下降幂,这个很有用。
仍然先给出式子。
证明考虑生成函数。
令 \(F,G\) 分别为 \(f,g\) 的 EGF,那么即可推出下式。
也就是说 \(F(x)=G(e^x-1)\),稍作变换 \(F(\ln(x+1))=G(x)\),代入后继续化简 \(G(x)\)。
得证。
例题
由于斯特林反演没怎么见过,所以都是拿第二类斯特林数做普通幂转下降幂的东西。
P4827
首先考虑一个 \(O(nk^2)\) 的做法,我们拿二项式定理拆开幂次,然后换根维护前 \(k\) 次和,换根的时候二项式定理每次 \(O(k^2)\) 转移,复杂度 \(O(nk^2)\)。
然后普通幂转下降幂,令 \(d(u,v)=\mathrm{dist}(u,v)\)即可得到如下式子。
枚举上界可以是 \(k\) 的原因是组合数和斯特林数限制了求和上界是 \(\min(k,d(i,u))\),且超出该范围的值均为 \(0\),故值不变,容易单次 \(O(k)\) 换根维护。
CF932E
这里主要讲平方做法。
仿照上一个题,我们把普通幂转下降幂,交换求和顺序后把组合数吸收到一起。
这个时候我们发现后面的东西只和 \(i-j\) 有关,那么我们改变求和上下界。
然后 \(O(k^2)\) 推斯特林数,\(O(k)\) 算组合数即可。