二项式反演学习笔记

这是同届队爷 2020 年 5 月学的
为什么我怎么菜现在才学呜呜呜呜。。。

二项式反演学习笔记

众所周知,奇偶布的容斥很差,是一个板子都不会的傻子。二项式反演是一种广义容斥,只需要将具有容斥关系的状态设出套式子就可以解决容斥问题的工具。所以一些容斥很好的 ( exttt {dalao}) 是没有必要学习二项式反演的QAQ。

理论部分:

二项式反演主要有三个式子,最基础的式子是:

[f(n) = sum_{i = 0}^n (-1)^i {n choose i}g(i)\ g(n) = sum_{i = 0}^n (-1)^i {n choose i}f(i)\ ]

这是二项式反演的基础式子,而对于反演的证明,诸如此类 (sum)(0 o n) 的,我们可以通过证明 (sum_{i = j}^n (-1)^{i + j}{n choose i}{ i choose j} = e) 来完成。

注意到这里出现类诸如 ({n choose i}{i choose j}) 的形式,我们有第一个组合恒等式:(当然组合意义更好记忆)

[{n choose i}{i choose j} = frac{n!i!}{i!j!(n - i)!(i - j)!} = frac {n!} {j!(n - j)!} imes frac{(n - j)!}{(n - i)!((n - j) - (n - i) )!} = {n choose j}{n - j choose n - i} ]

有了这个组合恒等式,我们变化一下式子:

[sum_{i = j}^n(-1)^{i + j}{n choose i}{i choose j} = {n choose j}(-1)^j sum_{i = j}^n(-1)^i {n - jchoose n - i} ]

求和那一部分长得像二项式定理,换个元看一看(主要换组合式子里的),令 (t = n - i) ,那么求和部分变为:

[sum_{t = 0}^{n - j}(-1)^{n - t}{ n - j choose t} = (-1)^n (1 - 1)^{n - j} ]

所以当且仅当 (n = j) 时,原式 (=1),否则 (=0)。所以 ( exttt {QED})

但是我们可以发现这一个基础式子不怎么好用,很少有两种容斥状态之间的关系存在 ((-1)^{i}) ,一般都是至多至少与恰好。所以我们对这一个基础式子变一下形。

我们令 (h(n) = (-1)^ng(n)) ,这样就能将 ((-1)^n) 去掉,我们就得到了第二个二项式反演的式子:

[f(n) = sum_{i = 0}^n{n choose i}h(i)\ h(n) = sum_{i = 0}^n(-1)^{n -i} {n choose i}f(i) ]

我们可以观察到,现在 (f)(h) 有了明确的容斥关系,此时 (h(i)) 表示恰好(i) 的计数部分,(f(n)) 表示至多(n),并在 (n) 中任意选取的总的计数部分。

但做过很多题目的 ( exttt {dalao}) 会发现,你这也没把所有容斥题目包含完啊,还有很多题目 (f)(g) 的关系是 "至少/钦定""恰好" 呢,你上面的式子只能计算至多时好计算的呢!所以,有 ( exttt {dalao}) 就得到了第三个式子。

[f(n) = sum_{i = n}^{m} {i choose n} g(i) \ g(n) = sum_{i = n}^m (-1)^{i - n} {i choose n}f(i) ]

这里的 (m) 一般是题目给定的上界。

具体的证明可以直接带入,但过程比较复杂,这里就不放了(。

容易发现,这里 (f) 一般是钦定或者是至少选了 (n) 项,当这玩意好算的时候我们就会用这个。

理论部分结束QAQ。

( exttt{dalao}) 可能会发现,这玩意抛开容斥组合意义不看,和莫比乌斯反演至少在 (f/g) 这里有相似之处。一是也有两种形式供君选择,二是我们往往会令答案需要求的为 (g) ,并且题目的性质出发,去设出恰当好算的 (f) ,然后再得到答案。

经典例题:

1. 至多问题:

Problem.对一个排列 (a_i) 任意打乱顺序,请你求出有多少种排列方式,使得存在 (a_i ot= i)

Solution: 我们可以发现,我们好判断的是 (a_i = i) ,所以我们可以钦定有多少个 (a_i = i),那么剩下的随便排,所以得到了状态 (f), (f(n)) 表示至多存在 (n) 个数满足了错排的样子。所以直接使用形式 (2) ,我们要求的 (g(n)) 是表示恰好(n) 个数满足错排,他们之间的关系满足形式 (2)(f(n) = sum_{i = 0}^n{nchoose i}g(i)),并且 (f(n)) 方便求得,故直接算即可。

2. 至少/钦定问题:

Problem.有一个 (n) 个元素的集合,一共有 (2^n) 个子集,请你找出若干子集(至少有一个),使得他们的交集有 (k) 个元素,求出找子集的方案数。

Solution: 我们先找到 (k) 个元素,并且将其钦定为必须选择的 (k) 个,剩下的 (n - k) 个元素可选可不选,那么现在找若干集合的方案数好求, (f(k) = {n choose k} (2^{2^{n - k}} - 1)) :表示现在所选集合交集至少有 (k) 个元素的方案数。(g(n)) 与其满足形式 (3) :(f(n) = sum_{i = n}^m{ichoose n} g(i)) ,故 (g) 可以直接算出。

扩展题目:

CF997C Sky Full of Stars:

​ 有一个 (n imes nspace (1 le n le 10^6)) 的正方形网格,用三种颜色染色,求有多少种染色方案使得至少一行或一列是同一种颜色。

Solution: 如果直接用组合式去表达染色的方案数的话,可以发现是会有重复的。既然存在重复的部分,并且这重复的部分已经能够用组合式子 表达出来了,所以不难想到使用容斥解决。我们设 (g(i,j)) 表示恰好有 (i)(j) 列是同一种颜色,那么答案就可以被表示为 (3^{n^2} - g(0,0)) 。考虑求 出 (g(0,0)) ,那么根据刚才发现设 (f(i,j)) 表示为至少 (i)(j) 列是同一种颜色,其满足 (f(x,y) = sum_{i = x}^nsum_{j = y}^n(-1)^{i+j}{i choose x}{j choose y}g(i,j)) 。所以 (g) 可以 通过反演求得,但由于 (n) 过大,所以我们要变换一下式子。(以下的式子只是一部分需要推的)

[sum_{i = 1}^nsum_{j = 1}^n(-1)^{i + j}f(i,j) = sum_{i = 1}^n (-1)^isum_{j = 1}^n(-1)^j {n choose i} {n choose j} 3^{1 + n^2 - n*i-n*j + i*j} ]

​ 观察,里面有 ((-1)^i) ,考虑二项式定理,把 (i,j) 的部分分开放。

[=3^{n^2 + 1}sum_{i = 1}^n {n choose i}(-1)^i3^{-n*i}sum_{j = 1}^n(-1)^j {n choose j} 3^{(i - n)^j}\ =3^{n^2 + 1}sum_{i = 1}^n {n choose i}(-1)^i3^{-n*i}sum_{j = 1}^n(-1)^j {n choose j} (-3)^{(i - n)^j} \ =3^{n^2 + 1}sum_{i = 1}^n {n choose i}(-1)^i3^{-n*i}((1 - 3^{i - n})^n - 1) \ ]

​ 便可以 (O(nlogn)) 计算了。

[AGC035F] Two Histograms

​ 有一个 (n imes mspace (1 le n,m le 5 imes 10^5)) 的棋盘,对于每一行和每一列选择当前行和列的一个格子,并将从这个行或列的起始点到这个格子全部 (+1),得到的棋盘本质不同的有多少种。

Solution: 随便操作一下,容易发现很容易就将染出重复颜色棋盘来。重复的原因在于一行一列交在了一起并且不再向下延申,而此时这种染色 情况对应了两种染色的方案,所以我们规定当且仅当行染到这里才是合法的,明显地,这样规定之后不会对答案产生干扰。这样对重复的东西规 定之后,不难想到使用容斥(二项式反演)来统计方案,我们设 (f(i)) 表示规定 (i) 个位置不合法,其余随便填。那么 (f(i)) 方便表示出来。

[f(i) = i! {n choose i} {m choose i} (m + 1)^{n - i}(n + 1)^{m - i} ]

​ 具体意义是,我们先随便选将要产生不合法的行和列,然后利用 (i!) 对行和列进行配对,这样对于选取的行和列而言,其结果已经固定,再对剩下 的行和列进行选取。有了这一个那么 (g(i)) 就会是恰好 (i) 个位置不合法,答案将会是 (g(0)) 。其满足 (f(i) = sum_{j = i}^n {j choose i}g(j)) ,所以 (g(0)) 可由反演得 出 (g(0) = sum_{i = 0}^n (-1)^i{n choose 0} f(i))

原文地址:https://www.cnblogs.com/jojojojojob/p/14447058.html