加载中...

二项式反演

pZ7eEE6.png

对于图中的任何一个等式,等式左侧为已知项,而等式右侧包含未知项;若可以由 未知项关于等式右侧的某种形式 推演 已知项,那么就可以 反演 未知项 通过 已知项关于等式右侧的某种形式 ,进而得到答案。

P1595

经典的错排问题。

Q:\(n\) 封信,\(n\) 个信封,所有信都装错信封的方案数。

错排问题理解

pZ7efM9.jpg

二项式反演解法

大致思路:设大小为 \(n\) 的错排问题答案为 \(f(n)\),我们发现 \(f(n)\) 很难直接得到,因此我们需要考虑构造一个容易计算的 \(g(n)\),使得 \(g(n)\) 可以通过 \(f(n)\) 得到;若推式子发现 \(g(n)\)\(f(n)\) 满足上述的某一种反演形式,那么我们就能通过 \(g(n)\) 反演推算出 \(f(i)\)

这里设 \(g(n)\)\(n\) 的全排列方案数。

二项式反演过程:
pZ7mHwq.jpg

最终我们得到答案:

\[f(n) = \sum_{i=0}^{n}(-1)^{i}*\frac{n!}{i!} \]

code

二项式反演证明

pZ7uCvQ.png

pZ7uZ5V.png

形式二、三、四的证明与形式一完全类似。

P10596

Q:一共有 \(n\) 个数,能形成 \(2^{n}\) 个不同的子集。在这 \(2^{n}\) 个集合中挑出若干个集合(至少挑一个),希望这些集合的交集恰好有 \(k\) 个数,计算挑选集合的方案数。

定义 \(f(i)\):挑选集合之后,形成的交集大小恰好为 \(i\),方案数。\(f(k)\) 即为所求。

定义 \(g(i)\):任选 \(i\) 个元素作为钦定,钦定不同就认为方案不同。挑选集合之后,形成的交集至少包含钦定的 \(i\) 个元素,方案数。

计算 \(g(i)\):从 \(n\) 个元素中选 \(i\) 个元素作为钦定,共 \(C_{n}^{i}\) 种选择;由于交集一定包含钦定的 \(i\) 个元素,因此对于挑选的所有集合都必须包含这 \(i\) 个元素,因此我们只需要看剩余的 \(n-i\) 个元素如何划分集合,然后将每种划分方案的每个集合均加入这 \(i\) 个钦定元素即可;\(n-i\) 个元素形成共 \(2^{n-i}\) 个子集,每个子集需要作为是否被挑选的对象,因此共有 \(2^{2^{n-i}}\) 种挑选集合的方案,其中要去除掉不选择任何集合的方案,否则钦定的 \(i\) 个元素就无法加入到任何集合中,不满足题意。于是我们得到:

\[g_{i} = (2^{2^{n-i}} - 1) * C_{n}^{i} \]

这里我们需要利用二项式反演公式四:

\[g_{k} = \sum_{i=k}^{n}C_{i}^{k}*f(i) \Longleftrightarrow f_{k}=\sum_{i=k}^{n}(-1)^{i-k}*C_{i}^{k}*g_{i} \]

现在我们证明 \(f(i)\)\(g_{i}\) 之间恰好存在上述的二项式反演关系:对于任何一种挑选集合后,形成交集的大小为 \(i\) 的方案,它对至少包含钦定 \(k\) 个元素的贡献是 \(C_{i}^{k}\)(相当于从 \(i\) 个元素中挑 \(k\) 个作为钦定元素,每 \(k\) 个都是不同的钦定,别忘了钦定不同就认为方案不同),而这样的挑选集合方案共有 \(f_{i}\) 种,\(i \in [k, n]\)(至少为 \(k\),否则 \(< k\) 就无法钦定至少 \(k\) 个元素),于是便得证上图双箭头左侧的等式。

因此 \(f(i), g(i)\) 满足二项式反演形式四,而 \(g(i)\) 已知,因此可以利用双箭头右侧的等式,用 \(g(i)\) 反演出 \(f(k)\)

本题也是 钦定 \(k\) 个且至少(\(g[i]\)\(\rightarrow\) 恰好 \(k\) 个(\(f[i]\) 类型的典型例题。

code

P5505

Q:一共有 \(m\) 种特产,第 \(i\) 种特产有 \(a[i]\) 个,同一种特产之间的物品无差别。一共有 \(n\) 个同学,每个同学之间有差别。每个同学至少要得到一个特产,求分配特产的方案数。

定义 \(f_{i}\):分光所有特产,最终恰好\(i\) 个人无特产,方案数。答案即为 \(f_{0}\)

定义 \(g_{i}\):分光所有特产,任选 \(i\) 个人作为钦定(钦定人的集合不同就认为方案不一样),不获得任何特产,最终所有无特产的人中,至少要包含钦定的 \(i\) 个人,方案数。

显然,此时 \(f_{i}\)\(g_{i}\) 之间的关系和上一道题一样,可以用二项式反演形式四来表示:\(g_{k} = \sum_{i=k}^{n}C_{i}^{k}*f(i)\)。不同之处在于 \(g_{i}\) 的计算方式不一样。

现在考虑计算 \(g_{i}\):即钦定了 \(n\) 个人中的某 \(i\) 个人不获得任何特产,剩下的 \(n - i\) 个人分配所有特产。而对于每种特产,它们的分配是可以单独考虑的,也就是:对于某一种特产 \(A\),有 \(a\) 件,将其分配给 \(n - i\) 个不同的人,每个人可以不分配到特产(因为 \(g_{i}\) 的定义是“至少”包含钦定的 \(i\) 个人无特产,也可以存在其他人无特产的情况)。对于这种方案的计算,可以用隔板法:将 \(n-i\) 个人(不同)看作隔板,\(a\) 件特产 \(A\)(相同)看作小球,则方案数:\(C_{a+n-i-1}^{n-i-1}\)。对于共 \(j\) 种特产,分配的方案数可以用乘法原理计算:\(\prod_{k=1}^{j}C_{a_{k}+n-i-1}^{n-i-1}\)\(a_{k}\) 代表第 \(k\) 种特产的数量);而总共有 \(C_{n}^{i}\) 种钦定方式,因此:

\[g_{i} = C_{n}^{i}\prod_{k=1}^{j}C_{a_{k}+n-i-1}^{n-i-1} \]

利用二项式反演形式四,用 \(g_{i}\) 反演 \(f_{i}\) 即可。

code

P4859

二项式反演结合背包 dp。

Q:给定两个长度为 \(n\) 的数组 \(a, b\)\(a_{i}\) 表示第 \(i\) 个糖果的能量,\(b_{i}\) 表示第 \(i\) 个药片的能量。所有能量数值都不相同,每个糖果需要和某个药片配对(共形成 \(n\) 对)。若配对之后,糖果能量值 \(>\) 药片能量值,则称为糖果大的配对,否则称为药片大的配对。计算使得 糖果大的配对 比 药片大的配对 数量恰好多 \(k\),方案数。

设糖果大的配对数量为 \(a\),药片大的配对数量为 \(b\),显然有:\(a+b=n, a-b=k\),即:\(a = \frac{n+k}{2}\)。显然 \(n+k\) 为奇数时无解,方案数为 \(0\)

设定 \(f_{i}\):最终恰好\(i\) 个糖果大的配对,方案数。答案即为 \(f_{\frac{n+k}{2}}\)

设定 \(g_{i}\):任选 \(i\) 个糖果作为钦定,不同的钦定就认为方案不同。最终一定要至少保证钦定的 \(i\) 个糖果形成糖果大的配对,方案数。

可以看出 \(f_{i}, g_{i}\) 和前两道题一样,满足二项式反演形式四,因此剩下的任务就是计算 \(g_{i}\),用 \(g_{i}\) 反演 \(f_{i}\)

考虑计算 \(g_{i}\)

定义 \(dp_{i,j}\):在 \(1 \backsim i\) 号糖果中,钦定恰好 \(j\) 个糖果一定要形成糖果大的配对,不关心其他非钦定糖果如何配对(这些糖果如何配对对方案数无影响,这是和 \(g_{i}\) 唯一不同的地方),方案数(只与钦定的糖果相关)。

先将 \(a,b\) 排序,把 \(b\)\(<a_{i}\) 的数的数量预处理出来,记为 \(c_{i}\)。考虑状态转移:决策第 \(i\) 号糖果是否作为钦定的 \(j\) 个糖果中的某一个。

  • 不是:说明前 \(i-1\) 号糖果中存在 \(j\) 个钦定的糖果(\(dp_{i-1,j}\)),而\(i\) 号糖果不是钦定的糖果,它的配对情况不会对方案数造成影响,因此 \(dp_{i-1,j}\) 为该情况的总贡献。
  • 是:说明前 \(i-1\) 号糖果中存在 \(j-1\) 个钦定的糖果(\(dp_{i-1,j-1}\)),第 \(i\) 号糖果作为钦定的糖果,它可以与剩下的 \(c_{i}-(j-1)\) 个未被其他钦定糖果配对,且满足 \(b_{k} < a_{i}\) 的药片 \(k\) 配对,而第 \(i\) 个糖果与这些药片配对,形成的钦定方案均不相同,因此根据乘法原理,需要将二者乘在一起。

综上,状态转移式为:

\[dp_{i,j} = dp_{i-1,j} + dp_{i-1,j-1} * (c_{i}-(j-1)) \]

对于 \(g_{i}\),是需要考虑所有非钦定糖果的配对方式的,而非钦定糖果的配对情况可以是随意的,因此对于剩下的 \(n-i\) 个非钦定糖果,它们对方案数的贡献就是它们的全排列,即 \((n-i)!\)。因此:

\[g_{i} = (n - i)! * dp[n][i] \]

剩下的就是用 \(g_{i}\) 反演 \(f_{\frac{n+k}{2}}\)

code

P6478

二项式反演结合树上背包。

Q:有 \(n\) 个结点,\(n\) 为偶数,其中有 \(\frac{n}{2}\) 个结点属于小 \(A\)\(\frac{n}{2}\) 个结点属于小 \(B\)。给定 \(n-1\) 条边,所有结点组成一棵树,\(1\) 为根结点;给点长为 \(n\) 的数组 \(a\)\(a_{i}=0\) 表示第 \(i\) 个结点归小 \(A\) 所有,\(a_{i}=1\) 表示第 \(i\) 个结点归小 \(B\) 所有。游戏共 \(\frac{n}{2}\) 个回合,每回合需要两个人分出胜负,两个人都要选择一个自己拥有,但之前回合未选过的点作为本回合的当前点。若小 \(A\) 当前点的子树内有小 \(B\) 选的点,则小 \(A\) 胜;若小 \(B\) 当前点的子树内有小 \(A\) 选的点,则小 \(A\) 胜;否则平局。计算 \(\frac{n}{2}\) 里恰好出现 \(k\) 次非平局的游戏方法数,对于 \(k \in [0,\frac{n}{2}]\) 均求一次答案。两场游戏视作不同,当且仅当存在小 A 拥有的点 \(x\),小 B 在小 A 选择 \(x\) 的那个回合所选择的点不同(只关心每个点匹配了哪个点,回合顺序不重要)

既然回合顺序不重要,我们不妨将小 A 在每个回合选择了哪些点固定下来,决策小 B 在每个回合中选了哪个点,也就等价于计算符合要求的 \(b\) 的结点排列数量。

定义 \(f_{i}\):恰好有 \(k\) 个回合取得非平局,方案数。答案即为 \(f_{0\backsim \frac{n}{2}}\)

定义 \(g_{i}\):任意钦定 \(i\) 个回合,钦定不同认为方案不同,至少保证钦定的 \(i\) 个回合取得非平局,方案数。

显然 \(f_{i}, g_{i}\) 和前三道题一样,满足二项式反演形式四,因此剩下的任务就是计算 \(g_{i}\),用 \(g_{i}\) 反演 \(f_{i}\)

考虑计算 \(g_{i}\)

定义 \(dp_{u,i}\):考虑以 \(u\) 为根的子树,在该子树中选出 \(i\) 对结点,每对结点会产生胜负(即非平局,子树为包含关系),选出的对中结点均不同,方案数。

这里 \(g_{i}\)\(dp_{u,i}\) 之间的关系与上一道题是高度类似的:\(dp_{u,i}\) 只关心选出的造成非平局的 \(i\) 对结点的方案数;\(g_{i}\) 除了这个之外,还关心剩下的 \(\frac{n}{2}-i\) 对结点的配对方案 (对于这些结点,是否为非平局不重要,方案数为全排列个数))。因此 \(dp_{u,i}\)\(g_{i}\) 之间的关系为:

\[g_{i} = dp_{1,i} * (\frac{n}{2}-i)! \]

状态转移:对于子树 \(u\),决策点 \(u\) 是否参与 \(i\) 对非平局结点。

  • \(u\) 不在这 \(i\) 对非平局结点中:假设现在正在合并的子树为 \(v\),已经合并的部分子树为 \(u\),考虑 \(dp_{u,l}\)\(dp_{v, r}\) 的结合:

\[dp_{u,l+r} \leftarrow dp_{u,l} * dp_{v,r} \]

这是一个经典的树上背包问题,关于代码原理可见 树上背包

  • \(u\) 在这 \(i\) 对非平局结点的某一对中出现:显然 \(u\) 作为整个子树的根,包含子树内其他的任何点,因此它一定可以与其他结点分出胜负。考虑 \(u\) 属于小 A 还是小 B:若属于小 A,则我们必须在子树 \(u\) 中选择一个未被钦定的,且属于小 B 的结点与 \(u\) 匹配。假设子树 \(u\) 中一共有 \(num\) 个结点属于小 B,可匹配结点数量为 \(num - (i - 1)\)。故:

\[dp_{u,i} \leftarrow (num - (i-1))*dp_{u,i-1} \]

按照以上状态转移计算出 \(dp_{1,0\backsim\frac{n}{2}}\),进而得到 \(g_{i}\),用 \(g_{i}\) 反演出 \(f_{i}\)

code

posted @ 2026-02-09 22:44  小橘奏  阅读(34)  评论(0)    收藏  举报