[数论] 二项式反演

菜就多练,输不起就别玩,不会就是不会。

二项式推论

  • 1. (nm)=(nnm)
  • 2. (nm)=nm(n1m1)
  • 3. i=0nCni=2n
    证明:拆 (1+1)n
  • 4. i=0n(1)iCni=0
    特殊的,n=0,上式等于 1
    证明:拆 (11)n

这些是基础的,还有后面会说。

二项式反演

形式一

g(n)=i=0n(1)if(i)Cnif(n)=i=0n(1)ig(i)Cni

证明:
考虑一个全集 U={a1,a2,a3...an}
我们定义 f(i) 表示满足 i 个条件的方案数(求什么方案看题目定)。
我们定义 g(i) 表示不满足 i 个条件的方案数。
根据 fgg(n)=i=0n(1)if(i)Cni
根据容斥原理,上式得证。
根据 gff(n)=i=0n(1)ig(i)Cni
上式得证。

举个例子,我们要算满足条件 a1,a2,a3 的,应该加上所有方案,减去不满足 a1a2a3 的,加上不满足 a1,a2a1,a3a2,a3 的。再加上三次的。

然后同理可证另一个。
这个式子好像没什么用。

形式二

gn=i=0nCnififn=i=0n(1)niCnigi

我们来理解理解这个式子。
原理是这个:i=0nCni=[n=0]
fi 表示条件恰好满足 i 个的方案,gi 表示至多满足 i 个条件的方案。

换句话说,左边求的就是所有满足 n 个条件即以内的情况。

我们追踪一部分变量来理解这个问题。
假设现在有 6 个条件 a1,a2,a3,a4,a5,a6,我们现在想把 3 个条件的给减掉。比如说 a1,a2,a3
这个条件最终的贡献是 :C33C32+C31C30=0

那一个条件 a1 呢?
贡献是 C55C54+C53C52+C51C50=0

那六个条件呢?
我们知道 C00=1 ,所以归纳一下,只剩下 f6 了。

所以其实这就是一种特殊的容斥。

形式三

gn=i=nmCinfifn=i=nm(1)inCingi
其中 fi 表示恰好满足 i 个条件方案数。
gi 表示钦定满足 i 个条件方案数。

我们分析一下。
假设有 (a1,a2,a3,a4) 我们算一下 fg
我们算一下:
f2:
{a1,a2},{a2,a3},{a3,a4},{a1,a3},{a1,a4},{a2,a4}
g2:
{a1,a2}:{a1,a2}{a1,a2,a3}{a1,a2,a4}{a1,a2,a3,a4}...

综上,我们得出通过 fg 的公式:
gn=i=nmCinfi

现在看看怎么用 gf

我们跟踪一下 a1,a2,a3,a4
首先,在 i=2 时,我们加上贡献,它被加了 C22×C42 次。
然后,在 i=3 时,我们减去贡献,它被减了 C32×C43 次。
最后,在 i=4 时,我们加上贡献,它被加了 C42×C44 次。
我们发现它刚好等于 0

我们再跟踪一下 a1,a2,a3,a4,a5
i=2:+C22×C52
i=3:C32×C53
i=4:+C42×C54
i=5:C52×C55

我们知道,Cij×Cjk=Cik×Cijjk

所以上式为 0

好了你已经学会二项式反演了,现在我们做做几个题。

错排问题

问题:有多少个长度为 n 的排列 p 满足 i,pii

我们知道恰好 n 个位置 pii 非常难求。我们换个思路:至多 npii,怎么求?

我们设恰好为 f,至多为 g

显然,我们知道 f 很简单能求出 gg(n)=i=0nf(i)×Cni

所以我们直接二项式反演。

我们看看怎么求至多 k 个位置满足 pii

一眼顶针,不就是 (k)! 吗。

然后上反演即可。

第二类斯特林数

问题:把 n 个不同的小球放入 m 个不同的盒子里,要求每个盒子非空,有多少种放法?

我们定义 fi 表示恰好 i 个格子为空,gi 表示钦定 i 个格子为空。

那么我们能求出 fk=(mk)n。直接反演即可。

总结: 形式一的g和形式二的g虽然都是恰好,但不太一样,形式一的g是恰好满足某几个特定的性质,而形式的g是恰好满足多少个性质的总和。

posted @   g1ove  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示