二项式反演

引入

\([n]=\{1, 2, ......, n\}\)

\(n\) 是正整数,\(P\) 是符合某性质的元素的集合。

考虑集合 \(S_k=\{(a_1, a_2, ..., a_n)|\text{恰好有}k\text{个}a_i\in P\}\) 和集合 \(T_k=\{((a_1, ..., a_n), C)|C\subseteq [n], |C|=k, \forall c\in C, a_c\in P\}\)

二项式反演可以用于在数列 \((|S_1|,|S_2| ......, |S_n|)\) 和数列 \((|T_1|,|T_2| ......, |T_n|)\) 之间互相计算。

反演公式

一个显然的结论:\(|T_k|=\sum_{i=k}^n\dbinom{i}{k}|S_i|\)(只需按照 \(a_1, ......, a_n\) 有几个属于 \(P\) 分类即可)

因此需要利用 \(|T_k|\) 求出 \(|S_k|\) 的方法。公式如下:

\[|S_k|=\sum_{i=k}^n(-1)^{i-k}\dbinom{i}{k}|T_i| \]

可以用生成函数直接证明。

例题

已经没有什么好害怕的了

已知两个大小为 \(n\) 的集合是 \(S\)\(T\),求满足条件的双射 \(f:S\to T\) 的数量,满足恰好有 \(k\)\(x\in S\) 满足 \(f(x)<x\)

考虑求出恰好 \(k\) 个满足条件,可以转化为钦定 \(k\) 个必须满足条件(其他的不做要求)的方案数,再用二项式反演算出原问题答案。

现在需要求出钦定 \(k\) 个元素满足 \(f(x)<x\) 的方案数,即 \(T_k=\{(f:S\to T, C)|C\subseteq [S], |C|=k, \forall c\in C, f(c)<c\}\),这个可以考虑用 DP 算。

\(dp_{i, j}\) 表示 \(C\)\(S\) 中(从小到大)前 \(i\) 个元素中恰好 \(j\) 个元素组成, \(C\) 单射到 \(T\),并且满足 \(f(c)<c\) 的单射个数。

那么显然 \(dp_{n, k}(n-k)!=|T_k|\)

考虑如何递推,\(dp_{i, j}=dp_{i-1, j}+(t-j+1)dp_{i-1, j-1}\)\(t\)\(T\) 中比 \(s_i\) 小的数的个数,\(s_i\)\(S\) 中第 \(i\) 小的数)

加号前的部分表示 \(s_i\notin C\) 加号后的部分表示 \(s_i\in C\),而 \(f(s_i)\) 本来由 \(t\) 中选择,但是 \(C\) 中剩下的 \(j-1\) 个数会占用 \(j-1\) 个选择,所以 \(f(s_i)\) 还剩下 \(t-j+1\) 种选择。

posted @ 2025-06-11 13:10  yanzihe  阅读(44)  评论(0)    收藏  举报