斯特林数小结(update gradually...)

概念

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

第一类斯特林数

边界条件&&递推式

  • 先考虑无符号第一类斯特林数su(n,m)s_u(n,m)
  • 根据定义,易得边界条件:
    s(n,k)={0n<k1n=k0n>0  k=0s(n,k)=\begin{cases}0 & n<k \\ 1 & n=k \\ 0 & n>0\ ∧\ k=0 \end{cases}
  • 假设现在已知s(n1,k1)s(n-1,k-1),我们要加入一个新数nn。它可以考虑自己形成一个新的环,或者插入任意一个已有的数后面,因此:[nk]=[n1k1]+(n1)[n1k]\left[ \begin{matrix}n\\k\end{matrix} \right]=\left[ \begin{matrix}n-1\\k-1\end{matrix} \right]+(n-1)\left[ \begin{matrix}n-1\\k\end{matrix} \right]
  • 有符号的第一类斯特林数ss(n,k)s_s(n,k)与此类似。其递推式为:ss(n,k)=(1)n+ksu(n,k)=ss(n1,k1)(n1)×ss(n1,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(n2)O(n^2)

与上升/下降幂的关系

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

  • 上式加以变形可得到与下降幂xn=x(x1)(x2)(xn+1)x^{\underline{n}}=x(x-1)(x-2)\cdots(x-n+1)的关系:
    xn=k=1n(1)nk×su(n,k)×xk=k=1nss(n,k)×xkx^{\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
  • 这是因为我们把xnx^{\underline{n}}展开后,会发现它的各项系数的绝对值与xnx^{\overline{n}}一致,只是正负性会交错排列。

较为快速的求法

  • 考虑多项式F(x)=i=0n1(x+i)F(x)=\prod_{i=0}^{n-1}(x+i)的系数。
  • F(x)=xn=k=1n[kn]xk=k=0n[kn]xkF(x)=x^{\overline{n}}=\sum_{k=1}^n\left[ ^n_k \right]x^k=\sum_{k=0}^n\left[ ^n_k \right]x^k
  • 因此,F(x)F(x)的k次项系数即为[kn]\left[^n_k\right]

  • 考虑快速地求解[kn]\left[^n_k\right]
  • 当有模数的时候,可以分治NTT求解F(x)F(x)的各项系数(可以忽略掉i=0i=0时的(x+i)(x+i))。我们进行CDQ分治,区间[2l1,2r][2l-1,2r]表示(x+l)(x+l+1)(x+l+2)(x+r)(x+l)(x+l+1)(x+l+2)\cdots(x+r)的各项系数。记m=l+r2m=\dfrac{l+r}2,每次先求解区间[2l1,2m][2l-1,2m]和区间[2m+1,2r][2m+1,2r],尔后再合并。
  • 时间复杂度:O(nlog22n)O(n\log_2^2n);空间复杂度:O(n)O(n)

第二类斯特林数

回顾一下定义

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

边界条件&&递推式

  • 随便思考一下即可发现,边界条件与第一类斯特林数一致:
    S(n,k)={0n<k1n=k0n>0  k=0S(n,k)=\begin{cases}0 & n<k \\ 1 & n=k \\ 0 & n>0\ ∧\ k=0 \end{cases}
  • 假设现在已知S(n1,k1)S(n-1,k-1),要加入新数nn。它可以自己形成一个新的集合,或者加进先前已有的任意一个集合中去,于是:{nk}={n1k1}+k{n1k}\left\{ \begin{matrix}n\\k\end{matrix} \right\}=\left\{ \begin{matrix}n-1\\k-1\end{matrix} \right\}+k\left\{ \begin{matrix}n-1\\k\end{matrix} \right\}
  • 时间&空间复杂度:O(n2)O(n^2)

与下降幂的关系

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

通项公式

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

  • 以上说明过于感性,下面我们来理性一下。
  • 我们之前已经得出了:mn=i=0n{in}mim^n=\sum_{i=0}^n \left\{ ^n_i\right\}m^{\underline{i}}
  • mim^{\underline{i}}拆开来就变成:i=0n(nk){kn}x!\sum_{i=0}^n \binom nk\left\{^n_k\right\}x!
  • 那么,根据二项式反演,上式等价于:{mn}m!=i=0m(1)i(mi)(mi)n\left\{^n_m\right\}m!=\sum_{i=0}^m(-1)^i\binom mi (m-i)^n
  • 然后,我们把m!m!丢到右边去。

  • 至此,我们得到了第二类斯特林数的通项公式:
    {nm}=1m!i=0m(1)i(mi)(mi)n=i=0m(1)i(mi)ni!(mi)!\begin{Bmatrix}n\\m\end{Bmatrix}=\frac 1 {m!}\sum_{i=0}^m(-1)^i\binom mi(m-i)^n=\sum_{i=0}^m\frac{(-1)^i(m-i)^n}{i!(m-i)!}
  • 可以考虑预处理1i!(mi)!\frac1{i!(m-i)!}。单组询问的话,也可以预处理(mi)n(m-i)^n
  • 时间复杂度:O(mlogM)O(m\log M)O(m)O(m)。(MM为模数)
  • 如果我们要快速地求S(n,0)S(n,m)S(n,0)\sim S(n,m)怎么破?我们发现通项公式中,(1)ii!\frac{(-1)^i}{i!}只与ii有关,(mi)n(mi)!\frac{(m-i)^n}{(m-i)!}只与mim-i有关。所以可设两个多项式,用一个FFT/NTT,即可在O(mlogm)O(m\log m)的时间内求出。

与自然数幂和

  • 第二类斯特林数的一大亮点是可以快速求自然数幂和。
  • F(n)=i=1nikF(n)=\sum_{i=1}^n i^k。我们来现场推一波式子:
    F(n)=i=1nj=0k{kj}ij=i=1nj=0k{kj}j!(ij)=j=0k{kj}j!i=jn(ij)\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)O(nk)求解了。但是我们想更快。

  • 先给出一个结论:i=jn(ji)=(j+1n+1)\sum_{i=j}^n\left( ^i_j\right)=\left(^{n+1}_{j+1} \right)
  • 这个东西的证明,可以根据组合数的递推式依次展开(j+1n+1)\left(^{n+1}_{j+1} \right)来得到:
    (n+1j+1)=(nj)+(nj+1)=(nj)+(n1j)+(n1j+1)=(nj)+(n1j)+(n2j)+(n2j+1)=(nj)+(n1j)++(jj)+(jj+1)=(nj)+(n1j)++(jj)\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+1n+1个数排成一排,选j+1j+1个,枚举第一个数选的位置,剩下的数再选jj个,于是就成了上面的式子。

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

两类斯特林数之间的关系

i=0nS(n,i)s(i,m)=i=0ns(n,i)S(i,m)\sum_{i=0}^nS(n,i)s(i,m)=\sum_{i=0}^ns(n,i)S(i,m)

  • 这是为什么呢?我觉得应该可以数学归纳法,在此不作证明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章