二项式反演

二项式反演

简介

二项式反演可以用来解决一些计数问题,是连接 至少/至多恰好 两类函数的桥梁。

形式一

f(n)=i=0n(1)i(ni)g(i)g(n)=i=0n(1)i(ni)f(i)

证明

g(n) 入第一条式子。

f(n)=i=0n(1)i(ni)g(i)=i=0n(1)i(ni)j=0i(1)j(ij)f(j)

考虑每一个 f(j) 的系数。

f(n)=i=0nj=in(1)j(nj)(1)i(ji)f(i)=i=0nj=in(1)ji(ni)(niji)f(i)=i=0n(ni)j=in(1)ji(1)nj(niji)f(i)=i=0n(ni)j=0ni(1)j(1)nij(nij)f(i)=i=0n(ni)(11)nif(i)=f(n)

得证。

形式二

f(n)=i=0n(ni)g(i)g(n)=i=0n(1)ni(ni)f(i)

证明

h(n)=(1)ng(n)

所以

g(n)=(1)nh(n)

代入

f(n)=i=0n(1)i(ni)h(i)

由形式一

h(n)=i=0n(1)i(ni)f(i)

代回

g(n)=i=0n(1)ni(ni)f(i)

形式三

f(n)=i=mn(ni)g(i)g(n)=i=mn(1)ni(ni)f(i)

不难发现同形式一、二相比只改变了下界,然而这并不影响任何性质。

形式四

f(n)=i=nm(in)g(i)g(n)=i=nm(1)in(in)f(i)

证明

思路与形式一差不多。

重新证明一遍。

代入 g(n)

f(n)=i=nm(in)g(i)=i=nm(in)j=im(1)ji(ji)f(j)=i=nmj=ni(jn)(1)ij(ij)f(i)=i=nmj=ni(1)ij(in)(inij)f(i)=i=nm(in)j=ni(1)ij(1)jn(inij)f(i)=i=nm(in)(11)inf(i)=f(n)

应用

其中,形式三、四是经常用到的。

P1595 信封问题

错位排列问题。

f(i) 表示恰有 i 个信封在正确的位置上。

g(i) 表示至少 i 个信封在正确的位置上。

容易求得

g(i)=(ni)(ni)!

并有如下关系

g(i)=j=in(ji)f(j)

利用形式四进行二项式反演。

f(i)=j=in(1)ji(ji)g(j)

所求答案即为

f(0)=j=0n(1)j0(j0)g(j)=i=0n(1)i(ni)(ni)!

P4491 [HAOI2018] 染色

首先 K 最大为 min(NS,M)

恰好 出现 i 次的方案数为 f(i)

至少 出现 i 次的方案数为 g(i)

可以计算 g(i)

  • 首先选定 i 种颜色 乘上 (Mi)
  • 选定 iS 个位置 乘上 (NiS)
  • 考虑内部顺序 乘上 (iS)!
  • 内部顺序中,相同颜色交换算一种 除以 (S!)i
  • 剩下位置随意 NiS 个位置 Mi 种颜色 乘上 (Mi)niS

g(i)=(Mi)(NiS)(iS)!(Mi)niS(S!)i

又有关系

g(i)=j=iK(ji)f(j)

根据形式四,二项式反演

f(i)=j=iK(1)ji(ji)g(j)

答案为:

i=0KW[i]f(i)

故需要快速的求出所有的 f(i)

我们可以在 O(n) 的时间复杂度内预处理出所有的 g

如果暴力求 f(i) 时间复杂度来到 O(n2)

尝试卷积,拆开组合数

f(i)=j=iK(1)jij!i!(ji)!g(j)=1i!j=iK(1)ji(ji)!j!g(j)

我们进行了分离的操作,可以尝试卷积。

A(i)=(1)ii!B(i)=i!g(i)

故有

f(i)=1i!j=iKA(ji)B(j)

翻转 B 得到 C,即令 B(i)=C(Ki)

翻转 f 得到 F,即令 f(i)=F(Ki)

故有

F(Ki)=1i!j=iKA(ji)C(Kj)

已经看出卷积的形式了,使用 NTT 卷积即可。

参考代码

posted @   DeepSeaSpray  阅读(43)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示