斯特林数

6 篇文章 0 订阅
1 篇文章 0 订阅

第一类斯特林数

定义

[ n m ] = [ x m ] x n ‾ \begin{bmatrix}n\\m \end{bmatrix} = [x^m] x ^{\overline{n}} [nm]=[xm]xn
x x x n n n次上升幂的 x m x^m xm项的系数。

从此我们可以得到一个递推公式:

[ n m ] = ( n − 1 ) [ n − 1 m ] + [ n − 1 m − 1 ] \begin{bmatrix}n\\m \end{bmatrix} = (n - 1)\begin{bmatrix}n-1\\m \end{bmatrix} + \begin{bmatrix}n-1\\m-1 \end{bmatrix} [nm]=n1[n1m]+[n1m1]

现在考虑这个递推式的意义,相当于是将 n n n个不同物品分成 m m m个不同的环的方案数。

由此我们可以得到一些奇妙的想法:

先将 n n n个物品分成 m m m组,设每组分别有 a i a_i ai个,那么这时候一组的方案是 ( a i − 1 ) ! (a_i-1)! (ai1)!,再将每组方案乘起来,就得到了第一类斯特林数。

求法

由定义可以写一个分治 NTT \text{NTT} NTT计算,这里不多做解释。

下面讲一种复杂度低一些的做法

考虑如果已知 x n ‾ = ∑ i = 0 n a i x i x^{\overline{n}} = \sum_{i = 0}^{n} a_ix^i xn=i=0naixi,要求出 ( x + d ) n ‾ (x+d)^{\overline{n}} (x+d)n
将其展开得到

( x + d ) n ‾ = ∑ i = 0 n a i ∑ j = 0 i ( i j ) d i − j x j = ∑ j = 0 n x j ∑ i = j n ( i j ) d i − j a i (x+d)^{\overline{n}} \\ = \sum_{i = 0}^{n}a_i\sum_{j = 0}^i \binom{i}{j} d^{i-j}x^j\\=\sum_{j = 0}^{n}x^j\sum_{i = j}^n \binom{i}{j} d^{i-j}a_i (x+d)n=i=0naij=0i(ji)dijxj=j=0nxji=jn(ji)dijai

这样就可以 O ( n log ⁡ n ) O(n\log{n}) O(nlogn)的时间内做出,现在我们就可以合并两个 x n ‾ x^{\overline{n}} xn,这样子,复杂度满足 T ( n ) = T ( n 2 ) + O ( n log ⁡ n ) = O ( n log ⁡ n ) T(n) = T(\frac{n}{2}) + O(n\log{n}) = O(n\log{n}) T(n)=T(2n)+O(nlogn)=O(nlogn)

例题

问有多少个 1 − n 1-n 1n的排列满足有 a a a个前缀最大值, b b b个后缀最大值。

我们考虑以最大值来分开,考虑左右两边,易知左边有 a − 1 a-1 a1个前缀最大值,右边有 b − 1 b-1 b1个后缀最大值。

那么我们可以进行分组,满足每组中开头是一个前缀(后缀)最大值,下一组开头是另一个前缀(后缀)最大值。

那么一个大小为 k k k的组,方案是 ( k − 1 ) ! (k-1)! (k1)!,那不正是第一类斯特林数?所以答案就是 [ n − 1 a − 1 + b − 1 ] ( a − 1 + b − 1 a − 1 ) \begin{bmatrix}n-1\\a-1+b-1 \end{bmatrix} \binom{a - 1 + b - 1}{a - 1} [n1a1+b1](a1a1+b1)

第二类斯特林数

定义

x n = ∑ i = 0 n { n i } x i ‾ x^n = \sum_{i = 0}^{n} \begin{Bmatrix} n\\i\end{Bmatrix} x^{\underline{i}} xn=i=0n{ni}xi

由此可到次幂与下降幂之间的关系。

具体的,若要求次幂,我们可以通过转成下降幂来处理:

x n = ∑ i = 0 n { n i } x i ‾ = ∑ i = 0 n { n i } ( x i ) i ! x^n \\= \sum_{i = 0}^{n} \begin{Bmatrix} n\\i\end{Bmatrix} x^{\underline{i}} \\= \sum_{i = 0}^{n} \begin{Bmatrix} n\\i\end{Bmatrix} \binom{x}{i}i! xn=i=0n{ni}xi=i=0n{ni}(ix)i!

从而可以转成维护组合数

同样考虑递推式,可以得到 { n i } = { n − 1 i − 1 } + i { n − 1 i } \begin{Bmatrix} n\\i\end{Bmatrix} = \begin{Bmatrix} n - 1\\i - 1\end{Bmatrix} + i \begin{Bmatrix} n-1\\i\end{Bmatrix} {ni}={n1i1}+i{n1i}

还是考虑递推式的意义,意义是将 n n n个不同的物品放入 m m m个相同的盒子中。

下面我们由此得到其通项公式,我们考虑枚举硬点的空盒,然后用硬点容斥系数来计算,就可以得到其通项公式。
{ n m } = 1 m ! ∑ i = 0 m ( − 1 ) i ( m i ) ( m − i ) n \begin{Bmatrix} n\\m\end{Bmatrix} = \frac{1}{m!}\sum_{i=0}^{m}(-1)^i\binom{m}{i} (m - i)^{n} {nm}=m!1i=0m(1)i(im)(mi)n

还是其意义,我们分析一波,发现这个第二类斯特林数与等价类有关。也就是说, n n n个不同的物品放入 m m m个等价类的方案

由此我们可以得到一个基本想法

假设有 n n n个物品,每个物品染 1 − m 1-m 1m的一个颜色,问有 k k k个不同颜色的方案。那么设 g ( n ) g(n) g(n)表示总共的方案数,设 f ( m ) f(m) f(m)表示 n n n个物品染 k k k种颜色的方案,那么我们有
g ( n ) = ∑ i = 0 n { n i } f ( i ) g(n) = \sum_{i=0}^{n} \begin{Bmatrix}n\\i\end{Bmatrix}f(i) g(n)=i=0n{ni}f(i)
然后我们又知道如下反演:

g n = ∑ i = 1 n { n i } f i ⇔ f n = ∑ i = 0 n ( − 1 ) n − i [ n i ] g i g_n=\sum_{i=1}^{n}\begin{Bmatrix}n \\ i\end{Bmatrix}f_i \Leftrightarrow f_n=\sum_{i=0}^{n}(-1)^{n-i}\begin{bmatrix}n \\ i\end{bmatrix}g_i gn=i=1n{ni}fifn=i=0n(1)ni[ni]gi

所以就可以得到 f f f的值。

再丢一道斯特林反演的题目。

problem

那么我们考虑联通块是不是就是等价类?我们先硬点那么考虑一个有 i i i个联通块的方案,相当于至少 i i i个联通块。

那么考虑一个 i i i的方案,会在 i ’ ( i ′ &lt; i ) i’(i&#x27;&lt;i) i(i<i)中出现 { i i ′ } \begin{Bmatrix}i\\i&#x27;\end{Bmatrix} {ii}次,那么就有 ∑ i ′ = 0 i { i i ′ } f ( i ′ ) = [ i = 0 ] \sum_{i&#x27;=0}^{i}\begin{Bmatrix}i\\i&#x27;\end{Bmatrix}f(i&#x27;)= [i = 0] i=0i{ii}f(i)=[i=0]

解得 f ( n ) = ( − 1 ) n − 1 ( n − 1 ) ! f(n) = (-1)^{n-1}(n - 1)! f(n)=(1)n1(n1)!

而且大部分划分等价类的代价都是这个。

顺便说一下第二类斯特林数与贝尔数的关系,贝尔数就是第二类斯特林数一行的数的和

关于贝尔数,这里有一个好的求法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值