二项式反演学习笔记

前置知识

二项式定理:(a+b)n=i=0n(ni)aibni

二项式反演

反演公式1:

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

证明:

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

然后我们需要应用到组合数的一个结论:

(ni)(ij)=(nj)(njij)

尝试用组合意义理解:我们要在 n 个数中选一个 i 元子集 A,再选一个属于 Aj 元子集 B,左边就是先选 A 再选 B,右边是先选 B 再选 A,所以两者相等。

所以:

j=0ng(j)i=jn(1)ni(ni)(ij)=j=0ng(j)i=jn(1)ni(nj)(njij)=j=0ng(j)(nj)i=jn(1)ni(njij)=j=0ng(j)(nj)i=0nj(1)n(i+j)(nj(i+j)j)=j=0ng(j)(nj)i=0nj(1)(nj)i(nji)=j=0ng(j)(nj)(11)nj=g(n)

得证。

反演公式2:

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

反演公式3:

f(k)=i=kn(ik)g(i)g(k)=i=kn(1)ik(ik)f(i)

应用

关键:要求 g(n),尝试找到 f(n)=i=0n(ni)g(i)f(n) 便于计算,然后用反演求出 g(n)

题目一般会要求类似满足恰好 k 个性质的方案的个数,这个时候就很适合用二项式反演。

求错排

思路:

这个经典问题可以用二项式反演来做。

我们让 fn=n!Dn 表示错排数。

则会有:

fn=i=0n(ni)Di

还是组合意义来理解,每个排列都有若干个位置满足 pi=i,我们先枚举有多少个位置,再枚举哪些位置,剩下的必然是错排了。

于是我们可以直接二项式反演:

Dn=i=0n(1)ni(ni)fi=i=0n(1)nin!i!(ni)!i!=i=0n(1)nin!(ni)!=n!i=0n(1)ni(ni)!=n!i=0n(1)ii!

染色

n 个格子排成一行,需要用 k 种颜色染色,要求两两不同色且每种颜色至少出现一次。求方案数。

思路:

我们设 fk 表示用 k 种颜色染色两两不同色,但是不要求每种颜色至少出现一次。

再设 gk 表示表示用 k 种颜色染色两两不同色,要求每种颜色至少出现一次。

于是我们有:

fk=i=0k(ki)gi

如何理解?首先对于任何一种染色方案,我们必然是选取了 k 颜色的一个子集去染,枚举选了哪些子集即可。

至于 fk,这其实是 HNOI越狱 这题,我们可以知道 fk=k(k1)n1,于是:

gk=i=0k(1)ki(ki)i(i1)n1

然后就做完了。

求第二类斯特林数。

思路:

首先假设盒子有区别。

同理,fk 表示盒子可以为空,gk 表示盒子不能为空,可以得到:

fk=i=0k(ki)gi

又由于 fk=km,所以反演一下就能得到答案。

BZOJ 2839 集合计数

用二项式反演转化成至少 k 个,显然答案是 (nk)22nk,注意对指数取模要用模数减一。

posted @   rlc202204  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示