欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

第一类斯特林数学习记录

发布时间:2024/4/11 编程问答 62 豆豆
生活随笔 收集整理的这篇文章主要介绍了 第一类斯特林数学习记录 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

最近做题有时会碰到斯特林数(Stirling数),就觉得好好的学习一番,于是呢,写下这篇博客,来记录一些知识

简单介绍

第一类斯特林数表示表示将 n 个不同元素构成m个圆排列的数目。——百度百科

第一类斯特林数,可以表示为s(n,m)s(n,m)s(n,m),注意这里是小写
,要与大写的第二类斯特林数区分开来,定义上面也讲到了,但是呢,其实那句话最好改成第一类斯特林数的绝对值,因为第一类斯特林数是分正负的,分为无符号斯特林数su(n,m)s_u(n,m)su(n,m)和有符号斯特林数ss(n,m)s_s(n,m)ss(n,m)

有无符号Stirling数分别表现为其升阶函数和降阶函数的各项系数[类似于二项式系数],形式如下:
xn↓=x(x−1)(x−2)⋅⋅⋅(x−n+1)=∑k=0nss(n,k)xkx^{n\downarrow}=x(x-1)(x-2)···(x-n+1)=\sum_{k=0}^ns_s(n,k)x^kxn=x(x1)(x2)(xn+1)=k=0nss(n,k)xk
xn↑=x(x+1)(x+2)⋅⋅⋅(x+n−1)=∑k=0nsu(n,k)xkx^{n\uparrow}=x(x+1)(x+2)···(x+n-1)=\sum_{k=0}^ns_u(n,k)x^kxn=x(x+1)(x+2)(x+n1)=k=0nsu(n,k)xk

这是一个很烦的式子,但其实呢,有符号和无符号斯特林数之间的关系其实很简单ss(n,m)=(−1)n+msu(n,m)s_s(n,m)=(-1)^{n+m}s_u(n,m)ss(n,m)=(1)n+msu(n,m)
另外,这个式子的推导可以见我的另一篇博客:第二类斯特林数学习记录

计算公式

第一类斯特林数有个递推式很好想
想一下对于su(n,m)s_u(n,m)su(n,m)
n=0n=0n=0m=0m=0m=0那么显然就一种方案
n≠0n\neq0n̸=0m=0m=0m=0那么肯定分配不了,有0种方案
n≠0n\neq0n̸=0m≠0m\neq0m̸=0
那么考虑转移
倘若由su(n−1,m−1)s_u(n-1,m-1)su(n1,m1)转移而来,则说明新来的一个点自成一个环只有一倍的贡献
倘若由su(n−1,m)s_u(n-1,m)su(n1,m)转移而来,则说明新来的一个点插入到m个环中的n-1个空格的任何一个位置,那么就有n-1倍的贡献,递推式为su(n,m)=su(n−1,m−1)+(n−1)∗su(n−1,m)s_u(n,m)=s_u(n-1,m-1)+(n-1)*s_u(n-1,m)su(n,m)=su(n1,m1)+(n1)su(n1,m)
有符号的第一类斯特林数的递推式为ss(n,m)=ss(n−1,m−1)−(n−1)∗ss(n−1,m)s_s(n,m)=s_s(n-1,m-1)-(n-1)*s_s(n-1,m)ss(n,m)=ss(n1,m1)(n1)ss(n1,m)
证明是前面那个公式∑k=0ns(n,k)xk=xn↓=xn−1↓∗(x−n+1)=∑k=0n−1s(n−1,k)xk+1−n∗∑k=0n−1s(n−1,k)xk\sum_{k=0}^ns(n,k)x^k=x^{n\downarrow}=x^{n-1\downarrow}*(x-n+1)=\sum_{k=0}^{n-1}s(n-1,k)x^{k+1}-n*\sum_{k=0}^{n-1}s(n-1,k)x^kk=0ns(n,k)xk=xn=xn1(xn+1)=k=0n1s(n1,k)xk+1nk=0n1s(n1,k)xk
依次把xmx^mxm在左右两边的系数提取出来得到
另外有这个式子:(证明在第二类斯特林数的博客里)
xn↓=∑i=0n[ni]sxix^{n\downarrow}=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}_sx^ixn=i=0n[ni]sxi
我们可以通过这个公式在Θ(nlog2n)\Theta(nlog^2n)Θ(nlog2n)的复杂度内用分治+FFT求出某个nnn对应的所有su(n,m)s_u(n,m)su(n,m)

性质

除了一些比较容易想到的性质外,第一类斯特林数还有如下性质
su(n,2)=(n−1)!∗∑i=1n−11is_u(n,2)=(n-1)!*\sum_{i=1}^{n-1}\frac{1}{i}su(n,2)=(n1)!i=1n1i1
∑k=0nsu(n,k)=n!\sum_{k=0}^ns_u(n,k)=n!k=0nsu(n,k)=n!
容易发现,每一个排列都对应着一个轮换(相当于i到ai连一条边的一副图),然后枚举轮换里环的数量就好了

应用

第一类斯特林数是一种在组合方面比较有用的数,很多问题都可通过它来解决,熟悉它的性质,才能熟练的运用到公式推导的过程中去

总结

以上是生活随笔为你收集整理的第一类斯特林数学习记录的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。