二项式反演
引入
设 \([n]=\{1, 2, ......, n\}\)。
设 \(n\) 是正整数,\(P\) 是符合某性质的元素的集合。
考虑集合 \(S_k=\{(a_1, a_2, ..., a_n)|\text{恰好有}k\text{个}a_i\in P\}\) 和集合 \(T_k=\{((a_1, ..., a_n), C)|C\subseteq [n], |C|=k, \forall c\in C, a_c\in P\}\)。
二项式反演可以用于在数列 \((|S_1|,|S_2| ......, |S_n|)\) 和数列 \((|T_1|,|T_2| ......, |T_n|)\) 之间互相计算。
反演公式
一个显然的结论:\(|T_k|=\sum_{i=k}^n\dbinom{i}{k}|S_i|\)(只需按照 \(a_1, ......, a_n\) 有几个属于 \(P\) 分类即可)
因此需要利用 \(|T_k|\) 求出 \(|S_k|\) 的方法。公式如下:
可以用生成函数直接证明。
例题
已知两个大小为 \(n\) 的集合是 \(S\) 和 \(T\),求满足条件的双射 \(f:S\to T\) 的数量,满足恰好有 \(k\) 个 \(x\in S\) 满足 \(f(x)<x\)。
考虑求出恰好 \(k\) 个满足条件,可以转化为钦定 \(k\) 个必须满足条件(其他的不做要求)的方案数,再用二项式反演算出原问题答案。
现在需要求出钦定 \(k\) 个元素满足 \(f(x)<x\) 的方案数,即 \(T_k=\{(f:S\to T, C)|C\subseteq [S], |C|=k, \forall c\in C, f(c)<c\}\),这个可以考虑用 DP 算。
\(dp_{i, j}\) 表示 \(C\) 由 \(S\) 中(从小到大)前 \(i\) 个元素中恰好 \(j\) 个元素组成, \(C\) 单射到 \(T\),并且满足 \(f(c)<c\) 的单射个数。
那么显然 \(dp_{n, k}(n-k)!=|T_k|\)。
考虑如何递推,\(dp_{i, j}=dp_{i-1, j}+(t-j+1)dp_{i-1, j-1}\)(\(t\) 是 \(T\) 中比 \(s_i\) 小的数的个数,\(s_i\) 是 \(S\) 中第 \(i\) 小的数)
加号前的部分表示 \(s_i\notin C\) 加号后的部分表示 \(s_i\in C\),而 \(f(s_i)\) 本来由 \(t\) 中选择,但是 \(C\) 中剩下的 \(j-1\) 个数会占用 \(j-1\) 个选择,所以 \(f(s_i)\) 还剩下 \(t-j+1\) 种选择。

浙公网安备 33010602011771号