二项式反演与斯特林反演

1 二项式反演

1.1 引入

二项式反演与容斥原理有着很大的联系,在很大程度上二项式反演可以实现容斥的效果。

我们先从基础的容斥原理讲起,首先二元的容斥形式非常简单,如下:

|AB|=|A|+|B||AB|

更一般的,我们有:

|A1A2An|=1in|Ai|1i<jn|AiAj|++(1)n1×|A1A2An|

这就是容斥原理。

证明:设某一个元素被 m 个集合包含,则其对等号左边贡献为 1,对右边的贡献为:

i=1m(1)i1(mi)=i=1m(1)i(mi)=1i=0m(mi)(1)i=1(11)m=1

所以每个元素对等式左右两边的贡献相等。

1.2 基本形式

1.2.1 形式零

首先我们可以直接从容斥原理推出二项式反演的形式零。记 A 表示 A 在全集 U 下的补集,由集合基本知识:

|U||i=1nAi|=|i=1nAi||U||i=1nAi|=|i=1nAi|

可以得到:

|A1A2An|=|U|1in|Ai|+1i<jn|AiAj|++(1)n×|A1A2An||A1A2An|=|U|1in|Ai|+1i<jn|AiAj|++(1)n×|A1A2An|

考虑一种特殊的情况,即集合的交集大小只和集合的数量有关,那么我们可以令:

  • f(n)=|A1A2An|
  • g(n)=|A1A2An|

根据上面两个式子不难得到:

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

显然两者等价且可以互相推导,于是我们可以得出二项式反演的形式零

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

1.2.2 形式一

上面的的形式零并不常见,更常用的形式需要我们做一些变形。

设两个函数 f(n),h(n) 满足形式零,然后令 g(n)=h(n)(1)n,则形式零会变为:

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

移项可得:

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

我们给等式右边除以 (1)2i,由于 2i 一定为偶所以不改变正负性,然后我们就可以得到二项式反演的形式一

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

1.2.3 形式二

形式一中的和式是对 0n 求和,那么如果对于 nm 求和就可以得到二项式反演的形式二

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

证明:直接将右式代入左式可得:

f(n)=i=nm(in)j=im(1)ji(ji)f(j)=i=nmj=im(in)(1)ji(ji)f(j)=j=nmf(j)i=nj(1)ji(in)(ji)=j=nmf(j)i=nj(1)ji(jnji)(jn)=j=nm(jn)f(j)i=nj(1)ji(jnji)=j=nm(jn)f(j)i=0jn(jni)(1)i=j=nm(jn)f(j)(11)jn=j=nm(jn)f(j)[j=n]=(nn)f(n)=f(n)

于是原式成立。

1.3 例题

例 1 [BZOJ4665] 小 w 的喜糖

Link

首先我们先认为相同的糖是不同的,这样算出答案之后乘上 1ci! 即可,其中 ci 为第 i 种颜色个数。

接下来考虑二项式反演,令 f(i) 表示至少 i 个人拿到的糖与原先的种类相同的方案数,g(i) 表示恰有 i 个人拿到的糖与原先种类相同的方案数,根据二项式反演可得:

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

于是只需求出 f(i) 即可,我们考虑 dp 求出它。设 dp(i,j) 表示枚举到第 i 种颜色,钦定了 j 个人拿到的糖与原先种类相同,转移为:

dp(i,j)=p=0min(j,ci)dp(i1,jp)×(cip)×cip

f(i) 就等于 dp(m,i)×(ni)!,代入求出 g(0) 即可,复杂度 O(n2)

通过此例不难发现,“至少” 转 “恰好” 是二项式反演的一个重要运用场合。

2 斯特林反演

前置知识:斯特林数相关。

2.1 基本形式及证明

斯特林反演的基本形式与二项式反演类似,如下:

f(n)=i=0n{ni}g(i)g(n)=i=0n(1)ni[ni]f(i)

为了证明这个定理,我们需要先证明一个引理,称为反转公式:

k=mn(1)km{nk}[km]=[m=n]k=mn(1)nk[nk]{km}=[m=n]

我们将 mn 转化为下降幂的形式,然后再将下降幂转回普通幂:

mn=i=0n{ni}mi=i=0n{ni}j=0i(1)ij[ij]mj=i=0nmij=in(1)ji[ji]{nj}

为了使左右两边相等,我们需要满足 j=in(1)ji[ji]{nj} 只有在 i=n 时取到 1,其余时候都取 0,即它的值是 [i=n]。重新换元后即可得到:

k=mn(1)km{nk}[km]=[m=n]

对于下面的式子,我们将 mn 转化为普通幂的形式,再转化回下降幂的形式:

mn=i=0n(1)ni[ni]mi=i=0n(1)ni[ni]j=0i{ij}mj=i=0nmij=in(1)nj[nj]{ji}

同上,只有当 j=in(1)nj[nj]{ji}=[i=n] 时两边才能取等,换元后即可得到下面的式子。

接下来我们证明反演公式,先证 ,若 g(n)=i=0n(1)ni[ni]f(i),则有:

f(n)=i=0n[i=n]f(i)=i=0nf(i)j=in(1)ji{nj}[ji]=i=0n{ni}j=0i(1)ij[ij]f(j)=i=0n{ni}g(i)

接下来证明 ,若 f(n)=i=0n{ni}g(i),则有:

g(n)=i=0n[i=n]g(i)=i=0ng(i)j=in(1)nj[nj]{ji}=i=0n(1)ni[ni]j=0i{ij}g(j)=i=0n(1)ni[ni]f(i)

于是斯特林反演的公式得证。

同理,斯特林反演还有另一种形式:

f(n)=i=nm{in}g(i)g(n)=i=nm(1)in[in]f(i)

这与二项式反演的形式二也是相似的。

2.2 例题

例 1 [BZOJ4671] 异或图

Link

f(n) 表示将原图划分为至少 n 个互不相连的部分的方案数,g(n) 表示将原图划分为 n 个联通块的方案数。那么我们显然会有:

f(n)=i=nN{in}g(i)

意思是将 i 个联通块划分成 n 个部分,显然这 n 个部分之间一定互不相连,根据斯特林反演可得:

g(n)=i=nN(1)in[in]f(i)

于是我们求出 f(n) 即可求出最终答案。考虑怎样求 f(n),由于我们的点数只有 10,所以我们完全可以直接爆搜,将这些点分成 n 个部分。接下来我们只需要让这 n 个部分之间没有连边即可。将每一张图上这 n 个部分的连边保存下来,其余的置为 0,现在的问题就是求有多少种方案使得选出来的图的异或和为 0

显然这是线性基可以求解的问题,将所有数插入线性基,设成功了 k 次,则贡献即为 2sk。然后求出 f(n) 后代入公式求出 g(1) 即为答案。

posted @   UKE_Automation  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示