二项式反演

两年前学的东西,今天补一下笔记。

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\) 就是答案了。

可以在这里尝试应用一下(题目同 Description

https://www.luogu.com.cn/problem/P1595

AC Code:

https://www.luogu.com.cn/record/185696122

posted @ 2024-10-30 09:31  HinanawiTenshi  阅读(6)  评论(0编辑  收藏  举报