Loading

二项式反演

\[\begin{align*} f_i = \sum \binom i j g_j \Rightarrow g_i = \sum (-1) ^ {i - j} \binom i j f_j \end{align*} \]

\[\begin{align*} f_i = \sum \binom j i g_j \Rightarrow g_i = \sum (-1) ^ {j - i} \binom j i f_j \end{align*} \]

证明可以容斥证,但是咕咕咕。

其中第二种式子有一个常有的组合意义,\(f_i\) 表示钦定 \(i\) 个条件满足的答案,\(g_i\) 表示恰好 \(i\) 个条件满足的答案。

关于“钦定”的定义

钦定指的是若干条件中,确定了一些特定的条件必定满足,剩余条件可满足可不满足的方案数。

钦定是近似于至少的,但是有本质不同。

\(5\) 个条件 \(S_1, S_2, S_3, S_4, S_5\)
那么如果 \(S_1, S_2, S_3\) 成立,会对“钦定 \(1\)” 产生 \(3\) 的贡献,对"钦定 \(2\)"产生 \(3\) 的贡献,对“钦定 \(3\)” 产生 \(1\) 的贡献。
但是,它对“至少 \(1\)”、“至少 \(2\)”、“至少 \(3\)” 都只产生 \(1\) 的贡献。

等号左侧组合意义显然,即我们在 \(j\) 个条件中选择 \(i\) 个钦定,就能从恰好转钦定。

但是,我们常用的 dp 等手段容易算出钦定而非恰好或至少,此时运用二项式反演可以实现钦定转恰好。

不过二项式反演也不一定用来钦定转恰好,很多时候可以推式子然后注意到这是二项式反演形式。

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

题意

给两个长为 \(n\) 的序列 \(a,b\),分别把两个序列中的数以任意顺序排列,使得 \(\sum [a_i \gt b_i] - \sum [a_i \lt b_i] = k\)

求方案数。

\(n, k \le 2000\),保证 \(a,b\) 的所有数字不重复。

做法

显然可以转换为求 \(\sum [a_i \gt b_i] = \frac {n + k} 2\) 的方案数,满足了这个剩下的自动满足。

\(f_i\) 为钦定 \(i\) 个位置满足 \(a \gt b\)\(g_i\) 为恰好 \(i\) 个位置满足 \(a \gt b\)

我们通过 dp 的方式求出 \(f\),转移顺序是 \(a\) 数组下标从前往后。
\(dp_{i,j}\) 表示考虑 \(a\) 数组的前 \(i\) 个,匹配出了 \(j\) 组。

\[dp_{i,j} = dp_{i - 1, j} + dp_{i - 1, j - 1} \times (a_i 能匹配的 b 的个数) \]

为了方便计算 \(a_i 能匹配的 b 的个数\),将 \(a,b\) 序列都排序,维护 \(cnt_i\) 表示 \(\sum \limits _ {j = 1} ^ n [a_i \gt b_j]\)
那么 \(a_i\) 能匹配 \(cnt_i - j + 1\)\(b\)(以前的 \(a\) 一定匹配到 \(cnt_i\) 个之一)。

转移:

\[dp_{i,j} = dp_{i - 1, j} + dp_{i - 1, j - 1} \times (cnt_i - j + 1) \]

二项式反演:

\[\begin{align*} f_i = dp_{n,i} \\ f_i = \sum \binom j i g_j \Rightarrow g_i = \sum (-1) ^ {j - i} \binom j i f_j \end{align*} \]

posted @ 2025-10-20 19:26  lajishift  阅读(6)  评论(0)    收藏  举报