Live2D

斯特林数小结

概念

  • 斯特林数(Stirling number)是由18世纪数学家James Stirling提出的两类数。
  • 第一类:轮换数,将n个数排成k个非空的环(圆排列,有序)的方案数,用\(s(n,m)\)\(\left[ \begin{matrix}n\\k\end{matrix} \right]\)表示。还分为无符号第一类斯特林数\(s_u(n,m)\)和带符号第一类斯特林数 \(s_s(n,m)\)
  • 第二类:子集数,将n个数排成k个非空集合(集合内无序)的方案数,用\(S(n,m)\)\(\left\{ \begin{matrix}n\\k\end{matrix} \right\}\)表示。

第一类斯特林数

边界条件&&递推式

  • 先考虑无符号第一类斯特林数\(s_u(n,m)\)
  • 根据定义,易得边界条件:

\[s(n,k)=\begin{cases}0 & n<k \\ 1 & n=k \\ 0 & n>0\ ∧\ k=0 \end{cases} \]

  • 假设现在已知\(s(n-1,k-1)\),我们要加入一个新数\(n\)。它可以考虑自己形成一个新的环,或者插入任意一个已有的数后面,因此\(s(n,k)=s(n-1,k-1)+(n-1)s(n-1,k)\)
  • 有符号的第一类斯特林数\(s_s(n,k)\)与此类似。其递推式为:\(s_s(n,k)=(-1)^{n+k}s_u(n,k)=s_s(n-1,k-1)-(n-1)\times s_s(n-1,k)\)
  • 时间&空间复杂度:\(O(n^2)\)

生成函数推导

  • 圆排列是把n个数排成一个环的方案数,n个数的圆排列即为\((n-1)!\)。因此其指数生成函数是\(Q(x)=\sum_{n≥1}\frac{(n-1)!x^n}{n!}=\sum_{n≥1}\frac{x^n}n=-ln(1-x)\)
  • 那么第一类斯特林数即是选取若干个集合,求圆排列的乘积和。因此\(s(n,m)=[x^n]n!(-ln(1-x))^m\)

与上升/下降幂的关系

  • 第一类斯特林数与上升幂\(x^{\overline{n}}=x(x+1)(x+2)\cdots(x+n-1)\)满足如下关系:\(x^{\overline{n}}=\sum_{k=1}^n s_u(n,k)\times x^k\)
  • 该式子可利用\(s_u(n,m)\)的递推式通过数学归纳法来证明。但其亦有简单的组合意义:
  • \(n\)个点,构成若干个环,要求一个环中所有点颜色相同,不同环不作要求。那么我们可以枚举环的组成(\(\sum_{k=1}^n s_u(n,k)\)),再给每个环分配颜色(\(x^k\));从另一个角度想,我们按编号从小到大加入每个点,每个点可在x种颜色中选择一种并自己形成一个新的环,亦可在前\(n-1\)个点中选择一个点接在它后面并继承它的颜色,那么操作方案数即为\(x^{\overline{n}}\)

  • 上式加以变形可得到与下降幂\(x^{\underline{n}}=x(x-1)(x-2)\cdots(x-n+1)\)的关系:\(x^{\underline{n}}=\sum_{k=1}^n (-1)^{n-k}\times s_u(n,k)\times x^k=\sum_{k=1}^n s_s(n,k)\times x^k\)

较为快速的求法

  • 考虑多项式\(F(x)=\prod_{i=0}^{n-1}(x+i)\)的系数。
  • \(F(x)=x^{\overline{n}}=\sum_{k=1}^n\left[ ^n_k \right]x^k=\sum_{k=0}^n\left[ ^n_k \right]x^k\)
  • 因此可以分治NTT。
  • 时间复杂度:\(O(n\log^2n)\);空间复杂度:\(O(n)\)

  • 考虑倍增。设\(F_n(x)=\prod_{i=0}^{n-1}(x+i)\),则\(F_{2n}(x)=F_n(x)F_n(x+n)\)
  • 我们现在要快速求出\(F_n(x+n)\)。之前已求出\(s(n,i)\),则\(F_n(x+n)=\sum_{i=0}^ns(n,i)(x+n)^i=\sum_{i=0}^ns(n,i)\sum_{j=0}^i\binom ijx^jn^{i-j}\)
  • 后面是一个卷积的形式,NTT优化。因此一次倍增复杂度为\(O(n\log n)\),总复杂度\(T(n)=T(n/2)+O(n\log n)=O(n\log n)\)

第二类斯特林数

回顾一下定义

  • 第二类斯特林数:子集数,将n个数排成k个非空集合(集合内无序)的方案数,用\(S(n,m)\)\(\left\{ \begin{matrix}n\\k\end{matrix} \right\}\)表示。

边界条件&&递推式

  • 随便思考一下即可发现,边界条件与第一类斯特林数一致:

\[S(n,k)=\begin{cases}0 & n<k \\ 1 & n=k \\ 0 & n>0\ ∧\ k=0 \end{cases} \]

  • 假设现在已知\(S(n-1,k-1)\),要加入新数\(n\)。它可以自己形成一个新的集合,或者加进先前已有的任意一个集合中去,于是\(S(n,k)=S(n-1,k-1)+kS(n-1,k)\)
  • 时间&空间复杂度:\(O(n^2)\)

生成函数推导

  • 一个集合内可以有正整数个数,因此一个集合的EGF是\(G(x)=\sum_{i≥1}\frac{x^i}{i!}=e^x-1\)
  • 那么\(S(n,m)=[x^n]n!(e^x-1)^m=\frac 1 {m!}\sum_{i=0}^m(-1)^i\binom mi(m-i)^n\)。下文有此通项公式的推导。

与下降幂的关系

  • 第二类斯特林数与下降幂\(x^{\underline{k}}\)满足如下关系:\(x^n = \sum_{k=0}^{n} S(n,k)\times x^{\underline{k}}\)
  • 与前面的一样,这个式子可以用数学归纳法证明,亦有组合意义:
  • 假设我们用\(x\)种颜色为\(n\)个点染色,方案数显然是\(x^n\);而我们也可以枚举同种颜色的集合是什么(\(\sum_{k=0}^{n} S(n,k)\)),然后从x种颜色中选出不同的颜色赋给这些集合(\(x^{\underline{k}}\))。

通项公式

  • 转换模型。不难发现\(S(n,k)\)等价于:将\(n\)个不同的球放入\(m\)个无差别的盒子中,要求盒子非空的方案数。
  • 我们先考虑盒子有差别的情况。
  • 考虑容斥。枚举空盒数\(i\),在\(m\)个盒子中选\(i\)个即为\(\binom mi\);那么,\(n\)个球可以放进剩下的\(m-i\)个盒子中,即为\((m-i)^n\)。容斥系数显然为\((-1)^i\)
  • 最后,消除盒子的差别,整体乘上一个\(\frac1{m!}\)

  • 以上说明过于感性,下面我们来理性一下。
  • 易知\(m^n=\sum_{i=0}^n \binom mi\left\{^n_i\right\}i!\)
  • 根据二项式反演,上式等价于:\(m!S(n,m)=\sum_{i=0}^m(-1)^i\binom mi (m-i)^n\)
  • 因此\(S(n,m)=\frac 1 {m!}\sum_{i=0}^m(-1)^i\binom mi(m-i)^n\)。右边是卷积的形式,NTT优化,即可做到\(O(n\log n)\)

与自然数幂和

  • 第二类斯特林数的一大亮点是可以快速求自然数幂和。
  • \(F(n)=\sum_{i=1}^n i^k\)。我们来现场推一波式子:
    \(\begin{aligned} F(n) & = \sum_{i=1}^{n} \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} i^{\underline{j}} \\ & = \sum_{i=1}^{n} \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j!\left( \begin{matrix}i\\j\end{matrix}\right) \\ & = \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j! \sum_{i=j}^n \left( \begin{matrix}i\\j\end{matrix}\right) \end{aligned}\)
  • 现在已经可以\(O(nk)\)求解了。但是我们想更快。

  • 先给出一个结论:\(\sum_{i=j}^n\left( ^i_j\right)=\left(^{n+1}_{j+1} \right)\)
  • 这个东西的证明,可以根据组合数的递推式依次展开\(\left(^{n+1}_{j+1} \right)\)来得到:
    \(\begin{aligned} \left( \begin{matrix}n+1\\j+1\end{matrix}\right) & =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n\\j+1\end{matrix}\right) \\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j+1\end{matrix}\right) \\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \left( \begin{matrix}n-2\\j\end{matrix}\right) + \left( \begin{matrix}n-2\\j+1\end{matrix}\right) \\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \cdots + \left( \begin{matrix}j\\j\end{matrix}\right) + \left( \begin{matrix}j\\j+1\end{matrix}\right)\\& =\left( \begin{matrix}n\\j\end{matrix}\right) + \left( \begin{matrix}n-1\\j\end{matrix}\right) + \cdots + \left( \begin{matrix}j\\j\end{matrix}\right) \end{aligned}\)
  • 也可以考虑组合意义:\(n+1\)个数排成一排,选\(j+1\)个,枚举第一个数选的位置,剩下的数再选\(j\)个,于是就成了上面的式子。

  • 然后我们可以继续化简。
  • 接着上面的队形:
    \(\begin{aligned} F(n) & = \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j! \sum_{i=j}^n \left( \begin{matrix}i\\j\end{matrix}\right) \\& = \sum_{j=0}^{k} \left\{ \begin{matrix}k\\j\end{matrix} \right\} j!\left( \begin{matrix}n+1\\j+1\end{matrix}\right)\\& = \sum_{j=0}^k\left\{\begin{matrix}{k}\\{j}\end{matrix}\right\} \frac{(n+1)^{\underline {j+1}}}{j+1} \end{aligned}\)
  • \(\left\{ ^k_j\right\}\)的值可以\(O(k^2)\)\(O(k\log k)\)预处理。而\((n+1)^{\underline{j+1}}\)是连续的\(j+1\)个自然数的乘积,则其一定是\(j+1\)的倍数,因此不必逆元。(当然,假如\((n+1)\)太大,要先模,那就得逆元了)逆元可以\(O(k)\)预处理,因此单次询问复杂度为\(O(k)\)

斯特林反演

  • 有个反转公式:\(\sum_k=(-1)^{n-k}s(n,k)S(k,m)=\sum_k=(-1)^{n-k}S(n,k)s(k,m)=\delta_{nm}\)。这个用数学归纳法可以证明。
  • 得到了这个之后,就可以反演了。设矩阵\(F_{i,j}=S(i,j)\)\(G_{i,j}=(-1)^{i-j}s(i,j)\),则\(F\)\(G\)互逆。因此\(f(n)=\sum_kS(n,k)g(k)⟺g(n)=\sum_k(-1)^{n-k}s(n,k)\)
  • 反演的大小s可以互换。
posted @ 2020-07-15 22:43  Iking123  阅读(330)  评论(0编辑  收藏  举报