斯特林数
Stirling Number
第一类斯特林数
定义
表示将 \(n\) 个不同元素构成 \(k\) 个圆排列的数目,记为 \(\begin{bmatrix}n\\k\end{bmatrix}\)。
其中,圆排列的定义是由若干个元素构成的环形排列,对于两个排列,如果他们能够互相通过旋转得到那么认为他们是等价的。
递推式
我们可以发现,这个可以用 dp 来做,递推式为
证明是平凡的,考虑新的元素是否自己形成新的圆排列还是插入之前的排列,注意到圆排列的性质,因此只有 \(n-1\) 个位置可供插入。
特别的,\(\begin{bmatrix}n\\n\end{bmatrix}=1,n\ge 0\) 且 \(\begin{bmatrix}n\\0\end{bmatrix}=0,n\ge 1\)。
与多项式的结合
最常见的是同一行,即 \(n\) 相同的斯特林数计算,不妨设多项式
根据递推式有
于是有
其实就是每一次考虑选择 \(x\) 还是 \(i\)。对着这个分治 NTT 可以做到两个 \(\log\),但是这个东西其实是 \(x\) 的上升幂,记作 \(x^{\overline{n}}\),利用这个方面知识可以做到一个 \(\log\),这个以后再多项式那部分写一写吧,但是需要记住上升幂的定义,后面还会提到。
第二类斯特林数
定义
将 \(n\) 个元素构成 \(k\) 个不区分的子集的方案数(不允许空子集),记为 \(\begin{Bmatrix}n\\k\end{Bmatrix}\)。
递推式
证明和第一类斯特林数一模一样。
通项公式
从证明思考,令 \(g_n(k)\) 表示允许空子集的情况下,子集有编号情况下答案,令 \(f_n(k)\) 表示不允许空子集的情况下的答案。则:
考虑对于 \(g\) 的计算,这个是容易的。每个数都有 \(k\) 种选择,答案为 \(k^n\),考虑 \(f,g\) 的关系。
二项式反演一下就有
最后乘上 \(\dfrac{1}{k!}\):
与多项式结合
上面的式子非常容易看出是卷积的形式,甚至不用凑,因此对于同一行的第二类斯特林数直接卷积即可快速得到。
简单应用
这部分是比较重点的,感觉补这一个就是为了这里。
上升幂和下降幂的转化
这个最简单,根据定义就可以得到 \(x^{\overline{n}}=(x+n-1)^{\underline{n}}\)
但其实还有一个有趣的式子,为 \(x^{\overline{n}}=(-1)^n(-x)^{\underline{n}}\),这两个反过来写也可以。
上升幂 / 下降幂和普通幂的转化
还在思考如何证明?回看一下上面的第一类斯特林数和多项式的结合,会发现其实就是反过来了而已,严谨一点利用归纳也可以反过来推回去。
对于前面的上升幂转化一下就会得到
令 \(x=-x\),就会得到
现在还剩普通幂转成下降幂和上升幂,有
这个好像不好直接证明,但是其实答案上面也写过了:
带入 \(g_n(k)=k^n,k!\begin{Bmatrix}n\\k\end{Bmatrix} = f_n(k)\),得到:
注意到后面那部分就是 \(x^{\underline{i}}\)。同样,用 \(x^{\overline{n}}=(-1)^n(-x)^{\underline{n}}\) 替换一下 \(x^{\underline{i}}\) 可以得到最后一个式子
可算是写完了,琢磨了一个下午。