斯特林数

第二类斯特林数

  • 记为 {nk},或者 S(n,k)

  • 表示将 n 个两两不相同的元素分成若干的非空集合的方案数

递推式

S(n,k)=S(n1,k1)+kS(n1,k)

S(n,0)=[n=0]

通项公式

S(n,m)=i=0m(1)miini!(mi)!

  • 证明考虑二项式反演

  • Gi 表示 n 个不相同的物品放在 i 个不同集合中,允许有空集的方案数

  • Fi 表示 n 个不相同的物品放在 i 个 不同集合中,不允许有空集的方案数

Gi=niGi=j=0i(ij)Fj

  • 那么二项式反演后,因为原本的意思是集合是没有区分的,那么 FiS(n,i)i!

  • 那么最后的结果就是最上面的那个式子

  • 对应的,有这样一个式子

nm=i=0nS(m,i)i!(ni)

  • 组合意义就是 m 个有标号物品放在 n 个有标号的盒子的方案数

  • 通过这个式子,可以求自然数幂和

S(n)=i=1nik

  • 把后面的用斯特林数表示

S(n)=j=0kS(k,j)j!(n+1j+1)

同一行的第二类斯特林数的计算

  • 同一行指的是 n 相同
  1. 通项公式卷积 O(nlogn)

  2. 利用 EGF (应该不常用)

第一类斯特林数

  • 记为 [nk],或者 s(n,k)

  • 表示将 n 个元素分成 k 个非空轮换的方案数

递推式

s(n,k)=s(n1,k1)+(n1)s(n1,k)

s(n,0)=[n=0]

通项公式

  • 好像没有实用的

同一行的第一类斯特林数的计算

  • 表示有关的生成函数 Fn=i=0ns(n,i)xi

  • 根据递推公式可以推出:

Fn(x)=i=0n1(x+i)=(x+n1)!(x1)!

  • 这个东西就是 xn 次上升幂

  • 对于这个的预处理,考虑 F2n(x)=Fn(x)Fn(x+n)

  • 那么通过 Fn(x) 求出 Fn(x+n) 后卷起来就可以了

Fn(x+n)=i=0ns(n,i)(x+n)i

  • 将后面那个东西二项式展开

Fn(x+n)=j=0nxjj!i=jns(n,i)i!nij(ij)!

  • 后面的部分是一个减法卷积,把一个多项式反过来就可以卷起来了

  • 还有一个更实用的方法,直接分治 NTT 对于这 n 个多项式卷起来,就是先卷左边再卷右边,最后合并两端的多项式,复杂度为 O(nlog2n)

同一列的第一类斯特林数的计算

  • 单个轮换的 EGF 是

F(x)=i=1n(i1)!i!xi=i=1nxi

  • 它的 k 次幂就是 s(i,k)

  • 对于 k 次幂可以先取 ln ,然后 exp

应用

  • 非常神奇的是这个 markdown 的上划线一直不显示,所以对于显示不出来的 markdown 用中文标注了

上升幂和普通幂的相互转化

xm(线)=ks(m,k)xk

xm=kS(m,k)(1)mkxk

下降幂和普通幂的相互转化

xm=ks(m,k)xk

xm线=kS(m,k)(1)mkxk

斯特林反演

  • 如果有

f(n)=i=0n{ni}g(i)

  • 那么

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

  • 还有一种形式

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

  • 那么

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

例题
CF961G Partitions

  • 对于一个 W(S)=|S|xSwx ,实际上集合中的每个数都对集合中的每个数做了一个贡献,那么我们考虑对于一个数会有多少的贡献
  • 对于 ji 的贡献显然是它们在一个集合的方案数,再加上 i 自己对自己的贡献,那么对于一个数的贡献其实是 s(n,k)+(n1)s(n1,k) ,用通向大力算就可以了

CF960G Bandit Blues

  • 对于最大值前面和后面都没有比自己更大的,所以以最大值为分界点

  • dp(i,j) 表示排列为 i 的前缀最大值有 j 个的方案数

  • dp(i,j)=dp(i1,j1)+(i1)dp(i1,j) ,这个其实就是第一类斯特林数

  • 那么 Ans=i=1nS(i1,a1)S(ni,b1)(ni)

  • 考虑这个的组合意义,Ans=i=1aS(n1,a+b2)(a+b2a1)

  • 剩下的难点就在于快速的求出第一类斯特林数了,分治 NTT 可以做到 O(nlog2n)

P4091 [HEOI2016/TJOI2016]求和

  • 因为 S(i,j)=0,j>i,所以式子可以写成:

f(n)=i=0nj=0nS(i,j)×2j×j!=j=0n2jj!i=0nS(i,j)=j=0n2jj!i=0nk=0j(1)k(jk)ik!(jk)!=j=0n2jj!k=0j(1)ki=0n(jk)ik!(jk)!

  • 那么将后面的这个东西卷起来就可以了,复杂度 O(nlogn)
posted @   Kzos_017  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示