二项式反演和 Min-Max 反演小记
二项式反演
本质上是某种容斥。
结论为:
更常用的形式是
证明第二个式子(EGF 证法):
记 \(f\) 的指数生成函数为 \(F(x)\),\(g\) 的指数生成函数为 \(G(x)\)。
那么
实际上还有一种形式:
或者写成:
错排问题
长度为 \(n\) 的排列 \(p\) 若对于 \(1\le i\le n\) 满足 \(i\not= p_i\),称它为一个错位排列。
将长度为 \(n\) 的错位排列数记为 \(D_n\)。
需要快速地求出某一 \(D_n\)。
对于所有长度为 \(n\) 的排列 \(p\),有 \(k\) 个 \(i\) 满足 \(p_i\not= i\) 的排列 \(p\) 的个数为 \(\binom{n}{k}D_k\)。
考虑枚举 \(k\) 即有:
套用反演结论即有
QOJ#5826 GDKOI2023TG D1T2
求有几个长度为 \(n\) 的排列 \(p\) 满足 \(\forall 1\le i\le m, p_i>m\) 且 \(\forall 1\le i\le n, p_i\not=i\), \(\operatorname{mod} 998244353\)。
不会正解,推个基本的式子。
考虑先在 \([m+1, n]\) 点 \(m\) 个数填在前 \(m\) 个位置上,然后将剩下除 \([1, m]\) 的 \(n-2m\) 个数填掉,最后把 \([1, m]\) 直接填进去。
发现第一步会有一个 \(\frac{(n-m)!}{(n-2m)!}\) 的系数,第三步会有一个 \(m!\) 的系数,把这两步系数的乘积记为 \(k\),而第二步的系数不太好计算,类似于原版错排问题。
枚举第二步中 \(p_i=i\) 的位置的个数:
令 \(l = n-2m\),那么
反演得
BZOJ3622 已经没什么好害怕的了
给定两个长度为 \(n\) 的序列 \(a,b\),将 \(a\) 与 \(b\) 两两配对,求 \(a\) 比 \(b\) 大的组恰好有 \(k\) 个的方案数。
\(n\le 2000\)
容斥dp
恰有 \(k\) 组不太好求,考虑用容斥变为钦定 \(k\) 组,其余随意。
用 \(g_i\) 表示恰有 \(i\) 组的方案数,\(f_i\) 表示钦定 \(i\) 组的方案数,那么:
这个式子珂能不太好理解,左边的意思是钦定 \(k\) 对,其余任选;右边的意思是对于每个 \(i\ge k\) 都可以点 \(k\) 组来钦定,因此这个式子是正确的。
这个式子可以直接套另一种二项式反演。
考虑将 \(f\) 数组 dp 出来:
\(f_{i,j}\) 表示当前 dp 到 \(i\),已经钦定了 \(j\) 对的方案数。
我们将 \(a, b\) 分别降序排序,方便 dp。
用 \(mx_i\) 表示 \(a_i\) 可以匹配的数的个数,那么可以轻易写出状态转移方程:
时间复杂度 \(\mathcal{O(n^2)}\)。
Min-Max 反演
首先由二项式定理可以得到一个式子
这个式子是好证明的:
Min-Max 反演的结论式为:
证明第一个式子,第二个式子的证明是类似的
期望形式同样成立:
Luogu P3175 [HAOI2015] 按位或
考虑对于每一位分别考虑,答案就是每一位第一次出现的时间的最大值。
最大值是不好处理的,使用 Min-Max 反演转化成最小值。
\(\min S = \dfrac1{\sum_{T\cap S\not ={\varnothing}}p_{T}}\)
发现交不为空实际上就是状压后位与起来不等于 \(0\),这个不好求,考虑求出位与起来等于 \(0\) 的和减一下就好了,位与起来为 \(0\) 也就是将 \(S\) 取反后 \(T\) 为 \(S\) 的子集,直接高维前缀和即可。
还有一道很神的题,这里是题解: Luogu P5643 [PKUWC2018]随机游走
Min-Max 反演推广——Kth Min-Max 反演
如何将一个集合中的第 \(k\) 大转化成子集 \(\min\) 呢?
发现 Min-Max 中用的结论是
如果找到函数 \(f(x)\) 使得 \( \sum_{T\subseteq S}f(|T|) = [|S|=k-1]\),就可以得出 Kth Min-Max 反演的式子。
我推的柿子:
二项式反演得
于是可以写出 Kth Min-Max 反演的式子:
期望形式同样成立。
Luogu P4707 重返现世
首先用 Kth Min-Max 反演:
注意到此处的 \(k\) 和题面中意义不同,实际上是 \(n-k+1\),所以非常小。
若用 \(\operatorname{sum}{S}\) 表示集合 \(S\) 中所有元素的和,则 \(E(\min T) = \dfrac m{\operatorname{sum}T}\),此处两个 \(T\) 第一个是表示第一次出现的时间集合,第二个是表示出现概率 \(p_i\) 的集合。
于是柿子变为:
考虑 dp 求出这个和式。
可以对于所有的 \(|T|\) 和 \(\operatorname{sum}T\) 求出其方案数,这样就可以计算了。这个是好容易用 dp 解决的,一个一个数考虑加不加入即可,但这样的时间复杂度是 \(\mathcal{O}(n^2m)\) 的,且没有用到 \(k\) 特别小的条件。
考虑减少状态,发现 \(\operatorname{sum}T\) 不好消去,只能把 \(|T|\) 这一维消去。
那么需要对于每个 \(j = \operatorname{sum}T\) 求出
考虑加入一个数时(也就是 \(|T|\) 增加 \(1\) 时)这个柿子会发生什么变化,可以发现 \((-1)^{|T|}\) 会取反且 \(\binom{|T|-1}{k-1}\) 会变成 \(\binom{|T|}{k-1}\),这个二项式系数发生了什么变化呢,观察不到 \(\binom{|T|}{k-1} = \binom{|T|-1}{k-1} + \binom{|T|-1}{k-2}\),于是可以在 dp 中记录 \(k\) 这一维进行递推。
\(f_{i, j, d}\) 表示当前 dp 到 \(i\) 时的 \(\sum\limits_{\operatorname{sum}T=j} (-1)^{|T|}\binom{|T|-1}{d}\),那么可以写出状态转移方程:
这样做时间复杂度是 \(\mathcal{O}(nmk)\),空间上可以将第一维滚掉。