二项式反演

二项式反演

本质上与广义容斥定理做的事情相同。

什么是反演

我们称一对关于序列的正向与逆向操作为一种反演(Inversion)。

具体的,前缀和与差分就可以被看作是一种反演。

公式

1、前缀和型

对于非负整数 \(n\),若数列 \(f_n,g_n\) 满足:

\[f_n = \sum ^n _{i=0} {n \choose i} g_i \]

则必有:

\[g_n = \sum ^n _{i=0} (-1)^{n-i} {n \choose i} f_i \]

反之亦然。

2、后缀和型(常用)

对于 \(0 \le k \le n\),若数列 \(f_k,g_k\) 满足:

\[f_k = \sum ^n _{i=k} {i \choose k} g_i \]

则必有:

\[g_k = \sum ^n _{i=k} (-1)^{i-k} {i \choose k} f_i \]

反之亦然。

这个证明同广义容斥原理,此处略去。

应用

第二类斯特林数

定义 \(g_k\) 为恰好 \(k\) 个盒子为空的方案数,\(f_k\) 为“至少” \(k\) 个盒子为空的方案数。目标显然是求 \(g_0\)

\(f_k = {m \choose k} (m-k)^n\),代入公式即得答案为 \(S(n,m) \times m!\)

染色问题

7

注意点

识别题目\(f_k\) 好求(可使用组合公式 / dp),\(g_k\) 不好求。

易错\(f_k\) 是“所有 \(k\) 元固定集合的方案数之和“,一个恰好 \(i\) 个的方案会被算 \(i \choose k\) 次。

二元二项式反演

前缀和型

\[f(n,m) = \sum^n_{i=0} \sum^m_{i=0} {n \choose i} {m \choose j} g(i,j) \]

\[g(n,m) = \sum^n_{i=0} \sum^m_{i=0} (-1)^{n-i+m-j} {n \choose i} {m \choose j} f(i,j) \]

后缀和型(常用)

\[f(x,y) = \sum^n_{i=x} \sum^m_{i=y} {i \choose x} {j \choose y} g(i,j) \]

\[\bold{g(x,y) = \sum^n_{i=x} \sum^m_{i=y} (-1)^{i-x+j-y} {i \choose x} {j \choose y} f(i,j)} \]

例题选讲

  • P5505 [JSOI2011] 分特产(插板法虚拟位置技巧

  • P10597 BZOJ4665 小 w 的喜糖(先看作互异的策略

注意到如果糖果互异,则该问题与错排问题类似。

我们考虑将这些糖果看作互不相同,则答案就是我们算出来的除以 \(\prod^{n}_{i=1} c_i\),其中 \(c_i\) 表示第 \(i\) 种糖果的个数。

\(g(i)\) 表示 恰好 \(i\) 个人拿到原始糖果的方案数。答案显然是 \(g(0)\)

\(f(i)\) 则表示 至少 \(i\) 个人拿到原始糖果的方案数。

依旧考虑 dp 计算 \(f(i)\)。定义 \(dp_{i,j}\) 表示前 \(i\) 个种类有 \(j\) 个人拿到原来糖果的方案数。套路的,我们需要钦定前面 \(c_i\) 个人中的 \(k\) 个人出来拿原始糖果,还要从 \(c_i\) 个糖果中拿出 \(k\) 个糖果分出去,然后这些糖果可以重排,因此贡献为 \({c_i \choose k}^2 \times k!\)

因此可得转移方程:

\[dp_{i,j} = \sum_{k=0}^{\min(j,c_i)} dp_{i-1,j-k} \times {c_i \choose k}^2 \times k! \]

于是,边界 \(dp_{0,0}=1\)\(f(i)=dp_{n,i}\),搞定。

  • P6478 [NOI Online #2 提高组] 游戏(树形 dp 求取 \(f(i)\)

\(g(i)\) 表示 恰好 \(i\) 个非平局面的方案数。答案显然是 \(g(k)\)

\(f(i)\) 则表示 至少 \(i\) 个非平局面的方案数

考虑树形 dp 计算 \(f(i)\)。定义 \(dp_{i,j}\) 表示以 \(i\) 为根的子树内有 \(j\) 个和它颜色不同的节点的方案数。转移根据乘法原理,就是 \(dp_{i,j}=\prod_{k_1+k_2+...k_{siz}=j} dp_{son_i,k_i}\),然后还得加上根节点单独的贡献 \(dp_{i,j} = dp_{i,j-1} \times (cnt_i-j+1)\)。最后 \(f(i)=dp_{1,i}\)

写代码时注意 dp 数组的干扰问题,可以设计 tmp 数组临时转移再赋值解决。

  • P6076 [JSOI2015] 染色问题(多元二项式模板,注意 \(n^m\) 计数的时候小心底数和指数别弄反了!!!

  • P3298 [SDOI2013] 泉(转换研究对象的思想 & 哈希状压

暴力求取 \(f(i)\)\(\mathcal{O}(n^2)\) 的,不可行。

这个时候我们考虑转换研究对象,从年份转为泉区。

注意到泉区的个数为 \(6\),想到枚举出所有的 \(2^6\) 个取位置的情况,我们现在只关注于这些位置。然后我们对每个年份求出对应位置的哈希值并排序,对于一个极长连续段(哈希值相等),它的贡献就是 \(\frac{siz \times (siz-1)}{2}\),将其加入 \(f_{siz}\) 即可,其中 \(siz\) 表示这个段的长度。

posted @ 2026-07-26 21:48  _KidA  阅读(35)  评论(0)    收藏  举报