二项式反演学习笔记

· · 算法·理论

二项式反演

二项式反演其实很像容斥的形式,我们先看一个例子:

考虑一个容斥:

设有一个数 A。那么有:

A = \sum_{j=0}^n (-1)^{j} \binom{n}{j} A

其中 A \in [1,n]。

显然有:

n-A = n - \sum_{j=0}^n (-1)^{j} \binom{n}{j} A

也有:

A = n - \sum_{j=0}^n (-1)^{j} \binom{n}{j} (n-A)

简单证明:这里相当于是让 A 变成它的“补集”(n-A),右侧就是全集减去原集。

令 f(i)=A,g(i)=n-A。特别的,我们令 f(0)=g(0)=n。

代换,得到:

g(n)=\sum_{i=0}^n (-1)^i \binom{n}{i}f(i) \\ f(n)=\sum_{i=0}^n (-1)^i \binom{n}{i}g(i)

这就是二项式反演的第一种形式。当然上面这个例子太特殊了,我们还是补一个详细的证明。

证明思路就是把 f 带到 g 的式子中去,然后推式子。

:::info[具体证明]

f(n)=\sum_{i=0}^n (-1)^i \binom{n}{i} \sum_{j=0}^i (-1)^j \binom{i}{j}f(j)

交换枚举顺序:

f(n) = \sum_{j=0}^n (-1)^j f(j) \sum_{i=j}^n (-1)^i \binom{n}{i}\binom{i}{j}

这里给出一个式子:

\binom{i}{j} \binom{j}{k}=\binom{i}{k}\binom{i-k}{j-k}

证明考虑组合意义:左边相当于在 i 个球里选 j 个球,再在 j 个球里选 k 个球,右边相当于先把 k 个球选出来,再选剩下的 i-k 个球。

把这个东西给带进去:

f(n) = \sum_{j=0}^n (-1)^j f(j) \sum_{i=j}^n (-1)^i \binom{n}{j}\binom{n-j}{i-j}

这样 \binom{n}{j} 就与 i 无关了,可以提到前面去,得到:

f(n) = \sum_{j=0}^n (-1)^j \binom{n}{j} f(j) \sum_{i=j}^n (-1)^i \binom{n-j}{i-j}

把后一项的 i 变成 i-j 得到:

f(n) = \sum_{j=0}^n (-1)^j \binom{n}{j} f(j) \sum_{i=0}^{n-j} (-1)^{i+j} \binom{n-j}{i}

把两个 -1 的幂次合并一下:

f(n) = \sum_{j=0}^n \binom{n}{j} f(j) \sum_{i=0}^{n-j} (-1)^{i+2j} \binom{n-j}{i}

一个显然的性质:\forall k \in \mathbb{Z}, (-1)^{2k}=1。

因此有:

f(n) = \sum_{j=0}^n \binom{n}{j} f(j) \sum_{i=0}^{n-j} (-1)^{i} \binom{n-j}{i}

后面这一坨一看就很像二项式定理对吧,我们给他补一个 1^k 上去:

f(n) = \sum_{j=0}^n \binom{n}{j} f(j) \sum_{i=0}^{n-j} (-1)^{i} 1^{n-j-i} \binom{n-j}{i}

得到:

f(n) = \sum_{j=0}^n \binom{n}{j} f(j) (1+(-1))^{n-j} f(n) = \sum_{j=0}^n \binom{n}{j} f(j) 0^{n-j}

当 j=n 时 0^0 显然会炸,其他时候 0^k=0,消掉了。我们特殊考虑一下 j=n,你发现式子变成了这样:

f(n)=\binom{n}{n}f(n) (-1)^0 \binom{0}{0}

这个右边显然与左边相等对吧。

证明大致就是这样,后续的大多也和这个思路相同。

:::

上面这种形式可以说是挺少见的,因为完全就是一个容斥的样子。

我们考虑令 h(n)=(-1)^n g(n),代换一下就有:

f(n)=\sum_{i=0}^n \binom{n}{i} h(i) \frac{h(n)}{(-1)^n} = \sum_{i=0}^n (-1)^i \binom{n}{i}f(i) h(n)=\sum_{i=0}^n (-1)^{n+i} \binom{n}{i}f(i)

显然 (-1)^{2i}=1,因此有:

h(n)=\sum_{i=0}^n (-1)^{n-i} \binom{n}{i}f(i)

然后你发现在具体证明中,我们并没有用到 i=0 这一性质,所以实际上,还有一个更通用的形式:

f(n)=\sum_{i=m}^n \binom{n}{i} h(i) h(n)=\sum_{i=m}^n (-1)^{n-i} \binom{n}{i}f(i)

这是第二种形式。类似的,还有第三种形式:

f(n)=\sum_{i=n}^m \binom{i}{n} h(i) h(n)=\sum_{i=n}^m (-1)^{i-n} \binom{i}{n}f(i)

证明和上面差不多,感兴趣的可以试试。这里不再阐述了。

这个之所以好用,是因为如果 f(n) 表示在方案中钦定 n 个的方案数,g(n) 表示恰好选 n 个的方案数,那么 g(i) 会由 f(n) 转移 \binom{i}{n} 次。

需要注意的是,由于钦定不同,可能导致一种方案由于不同钦定而被多次计算入 f,这是正常情况。

例题

P10596 BZOJ2839 集合计数

板子题。

设 f(i) 表示钦定有 i 个相同元素(意思就是这 i 个相同元素必须包含,其他可能还有别的相同元素)选集合的方案数,g(i) 表示恰好只有 i 个相同元素的方案数,显然有:

f(i) = \binom{n}{i}2^{2^{n-i}}

又有:

f(i) = \sum_{j=i}^n \binom{j}{i} g_j

相当于你在 j 个里面选 i 个作为你钦定的。

由二项式反演可知:

g(i)=\sum_{j=i}^n (-1)^{j-i} \binom{j}{i} f_j

P4859 已经没有什么好害怕的了

也是一个板子题,难点在 dp。

:::info[hint1] 一个显然的转化,由于一颗糖果只有可能有两种状态:“比与它配对的药片能量大”或“比能量小”,因此可以转化为求比能量大的数量为 \frac{n+k}{2} 的方案数。 :::

:::info[hint2] 设 f(i) 表示钦定有 i 组配对满足糖果比药片能量大的方案数,设 g(i) 为恰好有 i 组。显然有:

f(i) = \sum_{j=i}^n \binom{j}{i} g(i)

由二项式反演可知:

g(i) = \sum_{j=i}^n (-1)^{j-i} \binom{j}{i} f(j)
问题变成怎么求 f(i)。

:::info[hint3] 先对 a 和 b 排个序。考虑 dp,设 dp_{i,j} 表示前 i 个数,钦定有 j 组满足条件的方案数,设 a_i 比 cnt 个 b_j 大,那么有转移:

dp_{i,j} = dp_{i-1,j} + (cnt-j+1)dp_{i-1,j-1}

由于前面的 a_i',若满足条件,匹配的位置一定满足 b_j<a_i,于是有上述转移。

那么 f(i) = (n-1)!dp_{n,i}。

第二类斯特林数通项公式

先给出定义:n \brace k 表示将 n 个数划分成 k 个非空集合的方案数。

设 f(i) 表示将 n 个数划分到 i 个集合(可以为空)的方案数,设 g(i) 表示将 n 个数划分到 i 个非空集合的方案数。那么有:

f(i) = i ^n f(i) = \sum_{j=1}^i \binom{i}{j}g_j g_i = \sum_{j=1}^i(-1)^{i-j} \binom{i}{j}f_j

由于斯特林数集合无标号,所以说:

{n \brace k} = \frac{1}{k!}\sum_{j=1}^k(-1)^{k-j} \binom{k}{j} j^n

二维二项式反演

上面的所有式子都可以拓展到二维。

g(n,m)=\sum_{i=0}^n \sum_{j=0}^m (-1)^{i+j} \binom{n}{i} \binom{m}{j} f(i,j) \\ f(n,m)=\sum_{i=0}^n \sum_{j=0}^m (-1)^{i+j} \binom{n}{i} \binom{m}{j} g(i,j)

这里不再证明了,证明思路是大致相同的,感兴趣的可以自己整一下(虽然没啥必要)。

例题

P3158 [CQOI2011] 放棋子

这道题比较综合,二维二项式反演可以不用,但是也是一道很好的题目。思维难度中等。

:::info[hint1] 你发现每一行、每一列的贡献可以拆开来算,但是一颗棋子同时属于一行和一列,怎么做呢? :::

:::info[hint2] 你发现可以将不同的棋子的贡献拆开来考虑。 :::

:::info[hint3] 考虑 dp。设 dp_{i,j,k} 表示前 i 种颜色,恰好占了 j 行 k 列的方案数。那么有:

dp_{i,j,k} = \sum_{p=1}^j \sum_{q=1}^k \binom{j}{p} \binom{k}{q} g_{i,p,q} dp_{i-1,j-p,k-q}
其中 g_{i,p,q} 表示第 i 种颜色的棋子恰好放在 p 行 q 列的方案数。

:::info[hint4] 考虑如何求 g。

看到恰好就可以往二项式反演去想一下。

设 f_{i,j,k} 表示将第 i 种颜色的棋子放在 p 行 q 列中,可以有行或列为空的方案数。设第 i 种颜色的棋子有 cnt 个。

那么有:

f_{i,j,k}=\binom{pq}{cnt} f_{i,j,k}= \sum_{p=0}^j \sum_{q=0}^k \binom{j}{p} \binom{k}{q} g_{i,p,q}

由二维二项式反演可知:

g_{i,j,k} = \sum_{p=0}^j \sum_{q=0}^k (-1)^{j+k-p-q} \binom{j}{p} \binom{k}{q} f_{i,p,q}

:::