二项式反演
简介
二项式反演可以用来解决一些计数问题,是连接 至少/至多
与 恰好
两类函数的桥梁。
形式一
f(n)=n∑i=0(−1)i(ni)g(i)g(n)=n∑i=0(−1)i(ni)f(i)
证明
代 g(n) 入第一条式子。
f(n)=n∑i=0(−1)i(ni)g(i)=n∑i=0(−1)i(ni)i∑j=0(−1)j(ij)f(j)
考虑每一个 f(j) 的系数。
f(n)=n∑i=0n∑j=i(−1)j(nj)(−1)i(ji)⋅f(i)=n∑i=0n∑j=i(−1)j−i(ni)(n−ij−i)⋅f(i)=n∑i=0(ni)n∑j=i(−1)j−i(1)n−j(n−ij−i)⋅f(i)=n∑i=0(ni)n−i∑j=0(−1)j(1)n−i−j(n−ij)⋅f(i)=n∑i=0(ni)(1−1)n−if(i)=f(n)
得证。
形式二
f(n)=n∑i=0(ni)g(i)g(n)=n∑i=0(−1)n−i(ni)f(i)
证明
设
h(n)=(−1)ng(n)
所以
g(n)=(−1)nh(n)
代入
f(n)=n∑i=0(−1)i(ni)h(i)
由形式一
h(n)=n∑i=0(−1)i(ni)f(i)
代回
g(n)=n∑i=0(−1)n−i(ni)f(i)
形式三
f(n)=n∑i=m(ni)g(i)g(n)=n∑i=m(−1)n−i(ni)f(i)
不难发现同形式一、二相比只改变了下界,然而这并不影响任何性质。
形式四
f(n)=m∑i=n(in)g(i)g(n)=m∑i=n(−1)i−n(in)f(i)
证明
思路与形式一差不多。
重新证明一遍。
代入 g(n)。
f(n)=m∑i=n(in)g(i)=m∑i=n(in)m∑j=i(−1)j−i(ji)f(j)=m∑i=ni∑j=n(jn)(−1)i−j(ij)⋅f(i)=m∑i=ni∑j=n(−1)i−j(in)(i−ni−j)⋅f(i)=m∑i=n(in)i∑j=n(−1)i−j(1)j−n(i−ni−j)⋅f(i)=m∑i=n(in)(1−1)i−nf(i)=f(n)
应用
其中,形式三、四是经常用到的。
P1595 信封问题
错位排列问题。
设 f(i) 表示恰有 i 个信封在正确的位置上。
g(i) 表示至少 i 个信封在正确的位置上。
容易求得
g(i)=(ni)(n−i)!
并有如下关系
g(i)=n∑j=i(ji)f(j)
利用形式四进行二项式反演。
f(i)=n∑j=i(−1)j−i(ji)g(j)
所求答案即为
f(0)=n∑j=0(−1)j−0(j0)g(j)=n∑i=0(−1)i(ni)(n−i)!
P4491 [HAOI2018] 染色
首先 K 最大为 min(NS,M)。
设 恰好 出现 i 次的方案数为 f(i)。
至少 出现 i 次的方案数为 g(i)。
可以计算 g(i)
- 首先选定 i 种颜色 乘上 (Mi)
- 选定 iS 个位置 乘上 (NiS)
- 考虑内部顺序 乘上 (iS)!
- 内部顺序中,相同颜色交换算一种 除以 (S!)i
- 剩下位置随意 N−iS 个位置 M−i 种颜色 乘上 (M−i)n−iS
故
g(i)=(Mi)(NiS)(iS)!(M−i)n−iS(S!)i
又有关系
g(i)=K∑j=i(ji)f(j)
根据形式四,二项式反演
f(i)=K∑j=i(−1)j−i(ji)g(j)
答案为:
K∑i=0W[i]f(i)
故需要快速的求出所有的 f(i)。
我们可以在 O(n) 的时间复杂度内预处理出所有的 g。
如果暴力求 f(i) 时间复杂度来到 O(n2)。
尝试卷积,拆开组合数
f(i)=K∑j=i(−1)j−ij!i!(j−i)!g(j)=1i!K∑j=i(−1)j−i(j−i)!⋅j!g(j)
我们进行了分离的操作,可以尝试卷积。
设
A(i)=(−1)ii!B(i)=i!g(i)
故有
f(i)=1i!K∑j=iA(j−i)⋅B(j)
翻转 B 得到 C,即令 B(i)=C(K−i)。
翻转 f 得到 F,即令 f(i)=F(K−i)。
故有
F(K−i)=1i!K∑j=iA(j−i)⋅C(K−j)
已经看出卷积的形式了,使用 NTT
卷积即可。
参考代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!