二项式反演
两年前学的东西,今天补一下笔记。
Intro
考虑 \(n\) 个有标号的元素。
令 \(f_n\) 表示恰好 \(n\) 个元素满足条件(这里的条件取决于具体问题)的方案数,\(g_n\) 表示指定 \(n\) 个元素满足条件的方案数。那么显然有
\[g_n = \sum_{i=n}^m C_i^n f_i
\]
比如说,对于 \(f_i\),可以选出 \(n\) 个作为指定元素,所以对 \(g_n\) 的贡献为 \(C_i^n f_i\)。
根据二项式反演,
\[f_n = \sum_{i=n}^m (-1)^{i-n} C_i^n g_i
\]
二项式反演还有一种形式是
\[g_{n}=\sum_{i=0}^{n}C_n^i f_{i} \quad \Longleftrightarrow \quad f_{n}=\sum_{i=0}^{n}(-1)^{n-i}C_n^i g_{i}
\]
这里的 \(g_n\) 表示从 \(n\) 个元素中指定 \(i\) 个元素满足条件的总方案数。
从组合意义上看第一种更常用。
Application
一般来说题目要求的东西和 \(f\) 有关(比如问恰好有多少个元素满足条件,至少多少个元素满足条件等等)。
通常 \(f\) 并不容易直接求出,那么我们就可以先将 \(g\) 求出来,再通过二项式反演得到 \(f\)。
Example
Description
考虑一个有 \(n\) 个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排。然后需要你求出 \(n\) 个元素的所有排列中有多少个是错排。
Solution
这里我们可以将条件指定为元素在自己的位置上,可以发现 \(g_i = C_n^i \times (n-i)!\)(因为指定 \(i\) 个元素在自己位置上后其他元素可以任意决策位置)。最后使用二项式反演求出 \(f_0\) 就是答案了。
Link
可以在这里尝试应用一下(题目同 Description)
https://www.luogu.com.cn/problem/P1595
AC Code: