若已知 f(n)=∑g(k),用 f 表示 g 的过程就叫“反演”。
参考一下邓老师的 PPT。
经典题:n 个元素错排的方案数。要求线性。
考虑枚举有 k 个人非错排,可以得到这 k 个人一共有 (nk) 种选法,剩下的人有 (n−k) 个,都是随便站。总方案就是 (nk)×(n−k)! 但是显然会有重复。因此我们容斥,可以得到:
n∑k=0(−1)k(nk)(n−k)!
下面是重要的性质:
Important Lemma:
n∑k=0(−1)k(nk)=[n==0]
这个引理也很好理解:杨辉三角带符号行求和,由于其对称性显然为 0。
我们考虑设 f(n) 表示 n 个人随便站的方案数,这个显然是很好求的。设 g(n) 表示 n 个人错排的方案数,我们上面已经求了。用 f(n−k) 换掉 (n−k)! 可以得到:
g(n)=n∑k=0(−1)k(nk)f(n−k)
我们不妨换一个角度考虑。我们用 g 表示 f。我们枚举有 k 个人错位了,可以得到:
f(n)=n∑k=0(nk)g(k)
g(n)=n∑m=0[n=m](nm)g(m)
g(n)=n∑m=0n−m∑k=0(−1)k(n−mk)(nm)g(m)
- 我们注意到 (n−mk)(nm) 和 (nk)(n−km) 实际上是等价的,因为都等价于将一个集合划分成两个不交子集。所以有:
g(n)=n∑m=0n−m∑k=0(−1)k(n−mk)(nm)g(m)=n∑m=0n−m∑k=0(−1)k(nk)(n−km)g(m)=n∑k=0(−1)k(nk)n−k∑m=0(n−km)g(m)
我们惊奇的发现,右面的一坨就等于 f(n−k)!
g(n)=n∑k=0(−1)n−k(nk)f(k)
基于上面的推导,我们可以得到:
f(n)=n∑k=0(nk)g(k)⟺g(n)=n∑k=0(−1)n−k(nk)f(k)
这就是二项式反演?
f(n)=n∑k=0(−1)k(nk)g(k)⟺g(n)=n∑k=0(−1)k(nk)f(k)
这个式子非常对称。下面证明一下:不妨设 h(n)=(−1)ng(n)。那么有:
f(n)=n∑k=0(−1)k(nk)h(k)
h(n)=n∑k=0(−1)n−k(nk)f(k)(−1)ng(n)=n∑k=0(−1)n−k(nk)f(k)
g(n)=n∑k=0(−1)k(nk)f(k)
f(n)=∑k=n(kn)g(k)⟺g(n)=∑k=n(−1)k−n(kn)f(k)
f(n)=∑k=n(−1)k(kn)g(k)⟺g(n)=∑k=n(−1)k(kn)f(k)
这两种形式大概不需要过多解释了。
- P10596 集合选数
有 n 个集合,要选出子集集合 {Si},使得 |S1⋂S2⋂⋯⋂Sn|=k。求方案数。
-
使用二项式反演的关键在于构造两个函数 f,g,并且使得 f 比较好求。
-
不妨设 f(x) 表示钦定 x 个数必须选,剩下的随便选,选出子集的方案数。显然,我们要选出这 x 个数,剩下的数选或不选构成子集,子集选或不选再构成方案。所以 f(x)=(nx)(22n−x−1)。
-
不妨设 g(x) 表示选出子集交集大小为 x 的方案数。显然 g(k) 即为我们所求。我们寻求 f,g 之间的关系,可以得到:
f(x)=n∑k=x(kx)g(k)
根据二项式反演形式三,可以得到:
g(x)=n∑k=x(−1)k−x(kx)f(k)
这样可以做到线性。
Tip:在做二项式反演相关问题时,一般会”钦定“、”恰好选择“或”选择大于若干个“。
- P4491 染色
长度为 n 个序列,每个位置可以染 1∼m 的颜色。若出现次数为 s 的颜色种数为 k 则获得 wk 的代价。求所有染色方案的权值和。
按照套路,不妨设f(x) 为钦定了 x 中颜色必须选的方案数,g(x) 为出现次数为 s 的颜色种数恰好为 x 的方案数。首先不难得到:
f(x)=m∑k=x(kx)g(k)
根据二项式反演形式三不难得到:
g(x)=m∑k=x(−1)k−x(kx)f(k)
现在关键是 f 怎么求。首先要从 m 中颜色中选出钦定的那些,然后从 n 个位置选出一些把他们填上,然后再算上顺序,可以得到:
f(x)=(mx)(nsx)(s×x)!(s!)x(m−j)n−sx
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示