定义
第一类斯特林数\(s(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同圆排列里的方案数。
有转移方程:
\[s(n,m)=s(n-1,m-1)+(n-1)\times s(n-1,m)
\]
第二类斯特林数\(S(n,m)\)表示把\(n\)个不同元素放到\(m\)个相同集合里的方案数。
有转移方程:
\[S(n,m)=S(n-1,m-1)+m\times S(n-1,m)
\]
还有一些我自己的定义:
\(x\)的\(n\)次下降幂\(x_{(n)}=\prod_{i=0}^{n-1} (x-i)\)。
\(x\)的\(n\)次上升幂\(x^{(n)}=\prod_{i=0}^{n-1} (x+i)\)。
(只是因为我不会LaTeX写这东西而已)
求法
第一类斯特林数
求一行
有一个式子:
\[\sum_{k=0}^n s(n,k)x^k=\prod_{i=0}^{n-1}(x+i)=x^{(n)}
\]
利用数学归纳法来证明:
\[\begin{align*}
&x^{(n+1)}\\
=&(x+n)\sum_{i=0}^n s(n,i)x^i\\
=&\sum_{i=0}^{n+1}(s(n,i-1)+n\times s(n,i))x^i\\
=&\sum_{i=0}^{n+1}s(n+1,i)x^i
\end{align*}
\]
直接暴力分治FFT可以做到\(O(n\log^2 n)\),但还可以更好。
设
\[F_n(x)=\prod_{i=0}^{n-1}(x+i)=x^{(n)}
\]
由于\(F_{2n}(x)=F_n(x)F_n(x+n)\),所以求解\(F_{2n}(x)\)时,可以先求出
\[F_n(x)=\sum_{i=0}^n a_ix^i
\]
那么就有
\[\begin{align*}
F_n(x+n)&=\sum_{i=0}^n a_i(x+n)^i\\
&=\sum_{i=0}^n a_i\sum_{k=0}^i x^kn^{i-k}{i\choose k}\\
&=\sum_{k=0}^nx^k\frac{1}{k!}\sum_{i=k}^n a_i i!n^{i-k}\frac 1{(i-k)!}
\end{align*}
\]
后面显然是个卷积的形式,可以FFT求出来。
两边都有之后就可以乘在一起了。复杂度\(O(n\log n)\)。
求一列
同样是生成函数,把\(n\)个球丢进一个圆排列的方案数的质数生成函数是
\[\sum_{n>0} (n-1)!\frac{1}{n!}x^n
\]
那么丢进\(m\)个无序圆排列就是
\[\frac 1 {m!}(\sum_{n>0} (n-1)!\frac{1}{n!}x^n)^m
\]
然后多项式快速幂。
第二类斯特林数
求一行
由组合意义可得
\[n^m=\sum_{k=0}^m k!{n\choose k} S(m,k)
\]
等价于
\[n^m=\sum_{k=0}^n k!{n\choose k} S(m,k)
\]
二项式反演,得
\[k!S(m,k)=\sum_{i=0}^k i^m(-1)^{k-i}{k\choose i}
\]
(上式直接容斥也可以得到相同结果)
可以发现展开之后就是一个卷积,暴力FFT即可。
求一列
等价于分成\(m\)个集合不变,丢\(n\)个球进去,使得集合非空。
考虑\(n\)个球放入一个集合中的方案数的指数生成函数,就是
\[\sum_{n} [n\ne 0]\frac{1}{n!}x^n
\]
也就是
\[e^x-1
\]
那么\(m\)个不同集合,生成函数就是
\[(e^x-1)^m
\]
由于集合无序,所以变成
\[\frac 1 {m!}(e^x-1)^m
\]
然后可以多项式快速幂。
斯特林反演
这里丢个式子,并不打算证明qwq
\[f_n=\sum_{k=0}^n s(n,k)g_k\Leftrightarrow g_n=\sum_{k=0}^n (-1)^{n-k}S(n,k)f_k
\]
斯特林数与上升、下降、普通幂的关系
首先有上升下降幂之间的转化:
\[x^{(n)}=(-1)^n (-x)_{(n)}\\
x_{(n)}=(-1)^n(-x)^{(n)}
\]
较为显然,不证明。
然后有上面一个式子:
\[x^{(n)}=\sum_{i=0}^n s(n,i)x^i
\]
反演得到
\[x^n=\sum_{i=0}^n (-1)^{n-i}S(n,i)x^{(i)}
\]
上升和下降转化一下得到
\[x_{(n)}=\sum_{i=0}^n s(n,i)x^{i}(-1)^{n-i}
\]
把\(x\)替换为\(-x\)又可以得到
\[x^n=\sum_{i=0}^n S(n,i)x_{(i)}
\]
诸如此类……
总结一下,应该都是普通转上升/下降时用第二类,上升/下降转普通时用第一类。这也许和斯特林数最基本的定义有关。
其他一些可能有用的东西
\[S(n+1,m+1)=\sum_k{n\choose k}S(k,m)
\]
利用组合意义很容易理解。
\[s(n+1,m+1)=\sum_k s(n,k){k\choose m}
\]
这个学长不知道怎么组合意义,那我更不会了qwq
update:会了。
考虑后面的式子的意义,就是选出一些元素组成 \(m\) 个圆排列,剩下的随便搞。
那么就等价于加入一个特殊元素,分成 \(m+1\) 个圆排列,其中没有特殊元素的圆排列就是需要的 \(m\) 个圆排列,剩下的从特殊元素这里断开,可以对应到一个排列,而众所周知一个排列即可对应到任意组合的圆排列。