[学习笔记] 各种反演

1. 二项式反演

1.1. 公式

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

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

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

1.2. 一些题

例 1. ( ext{[NOI Online #2] })游戏

考虑 "钦定 (k) 次非平局" 枚举到的 "恰好 (k') 次非平局" 满足 (k’>k),我们考虑用第三个反演:设 (f(n)) 为钦定 (n) 次非平局的方案数,(g(n)) 为恰好 (n) 次非平局的方案数。

对于 (f(n)) 的求法,令 (dp_{i,j}) 为在 (i) 的子树内钦定 (j) 次非平局的方案数。用树型背包转移(之前在博客证明过)是 (mathcal O(n^2)) 的。注意还要做 (i) 和子树内未匹配点的匹配。

例 2. ( ext{[JSOI 2015] })染色问题

套路地设 (f(x,y,k)) 为有 (x)(y) 列至少一个被染,有 (k) 种颜色至少染了一个格子方案数,(g(x,y,k)) 就是恰好。然而 (f(x,y,k)) 非常难算,因为行和列是会相互影响的,这给我们单纯枚举某行某列格子被染带来了困扰。

然后我继续尝试,设 (f(x,y,k)) 为至少有 (x)(y) 列一个都没被染,有 (k) 种颜色至少染了一个格子方案数,(g(x,y,k)) 同理。那么((c+1) 是把不填也当作一种颜色),

[f(x,y,k)=inom{n}{x}inom{m}{y}inom{c}{k} (c+1)^{(n-x)(m-y)-k}cdotprod_{i=1}^k left((n-x)(m-y)-i+1 ight) ]

具体意义就是将选定 (k) 种颜色先染一个格子,再让剩下的格子随便乱选。燃鹅,这个式子会算重。

不过可以考虑另外两种定义:设 (f(x,y,k)) 为至少有 (x)(y) 列一个都没被染,有 (k) 种颜色 至多/没被 染了一个格子方案数,(g(x,y,k)) 同理。

对于至多,

[f(x,y,k)=inom{n}{x}inom{m}{y}inom{c}{k} (k+1)^{(n-x)(m-y)} ]

没被染,

[f(x,y,k)=inom{n}{x}inom{m}{y}inom{c}{k} (c-k+1)^{(n-x)(m-y)} ]

这两个式子最后反出来是一样的。

注:至多有 (x)(y) 列被染也是可行的。


( ext{Update})

发现自己完全没学懂… 其实 "有 (k) 种颜色至少染了一个格子" 的构造的本质问题不是算重,正常情况下甚至算重是被要求的。

先看看多步容斥:

[|A_1cup A_2cup...cup A_n|=sumlimits_{1le ile n}|A_i|-sumlimits_{1le i<jle n}|A_icap A_j|+...+(-1)^{n-1} imes |A_1cap A_2cap ...cap A_n| ]

(A_i) 表示满足条件 (i) 的元素集合,最终求得的结果只能是 "至少满足一个条件的元素集合" 或 "一个条件都不满足的元素集合"。

多数时候我们要求的是 "满足所有条件的元素集合",所以需要用到一个性质 —— 集合的并等于补集的交的补集。

[|A_1^ccap A_2^ccap ...cap A_n^c|=|S|-sumlimits_{1le ile n}|A_i|+sumlimits_{1le i<jle n}|A_icap A_j|-...+(-1)^n imes |A_1cap A_2cap ...cap A_n| ]

[|A_1cap A_2cap ...cap A_n|=|S|-sumlimits_{1le ile n}|A_i^c|+sumlimits_{1le i<jle n}|A_i^ccap A_j^c|-...+(-1)^n imes |A_1^ccap A_2^ccap ...cap A_n^c| ]

对于这道题,我们可以选择计算 "恰好 (k) 种颜色至少染了一个格子" 或 "恰好 (k) 种颜色一个格子也没染"。由于要取补,选择计算第一个。设 (A_i) 为第 (i) 种颜色一个格子也没染的元素集合,这里的 "元素" 就是一种染色方案,显然在选取的过程中会算重,但是只要按公式算就没有问题。

而且我的列式都错了哇… (f(x,y,k)) 的计算不需要加组合数,组合数是模拟枚举集合的过程。

原文地址:https://www.cnblogs.com/AWhiteWall/p/12665074.html