第一类斯特林数学习记录
发布日期:2021-06-29 06:00:12
浏览次数:2
分类:技术文章
本文共 2499 字,大约阅读时间需要 8 分钟。
最近做题有时会碰到斯特林数(Stirling数),就觉得好好的学习一番,于是呢,写下这篇博客,来记录一些知识
简单介绍
第一类斯特林数表示表示将 n 个不同元素构成m个圆排列的数目。——百度百科
第一类斯特林数,可以表示为 s ( n , m ) s(n,m) s(n,m),注意这里是小写
,要与大写的第二类斯特林数区分开来,定义上面也讲到了,但是呢,其实那句话最好改成第一类斯特林数的绝对值,因为第一类斯特林数是分正负的,分为无符号斯特林数 s u ( n , m ) s_u(n,m) su(n,m)和有符号斯特林数 s s ( n , m ) s_s(n,m) ss(n,m)有无符号Stirling数分别表现为其升阶函数和降阶函数的各项系数[类似于二项式系数],形式如下:
x n ↓ = x ( x − 1 ) ( x − 2 ) ⋅ ⋅ ⋅ ( x − n + 1 ) = ∑ k = 0 n s s ( n , k ) x k x^{n\downarrow}=x(x-1)(x-2)···(x-n+1)=\sum_{k=0}^ns_s(n,k)x^k xn↓=x(x−1)(x−2)⋅⋅⋅(x−n+1)=k=0∑nss(n,k)xk x n ↑ = x ( x + 1 ) ( x + 2 ) ⋅ ⋅ ⋅ ( x + n − 1 ) = ∑ k = 0 n s u ( n , k ) x k x^{n\uparrow}=x(x+1)(x+2)···(x+n-1)=\sum_{k=0}^ns_u(n,k)x^k xn↑=x(x+1)(x+2)⋅⋅⋅(x+n−1)=k=0∑nsu(n,k)xk
这是一个很烦的式子,但其实呢,有符号和无符号斯特林数之间的关系其实很简单 s s ( n , m ) = ( − 1 ) n + m s u ( n , m ) s_s(n,m)=(-1)^{n+m}s_u(n,m) ss(n,m)=(−1)n+msu(n,m)
另外,这个式子的推导可以见我的另一篇博客:计算公式
第一类斯特林数有个递推式很好想
想一下对于 s u ( n , m ) s_u(n,m) su(n,m) 若 n = 0 n=0 n=0, m = 0 m=0 m=0那么显然就一种方案 若 n ≠ 0 n\neq0 n̸=0, m = 0 m=0 m=0那么肯定分配不了,有0种方案 若 n ≠ 0 n\neq0 n̸=0, m ≠ 0 m\neq0 m̸=0 那么考虑转移 倘若由 s u ( n − 1 , m − 1 ) s_u(n-1,m-1) su(n−1,m−1)转移而来,则说明新来的一个点自成一个环只有一倍的贡献 倘若由 s u ( n − 1 , m ) s_u(n-1,m) su(n−1,m)转移而来,则说明新来的一个点插入到m个环中的n-1个空格的任何一个位置,那么就有n-1倍的贡献,递推式为 s u ( n , m ) = s u ( n − 1 , m − 1 ) + ( n − 1 ) ∗ s u ( n − 1 , m ) s_u(n,m)=s_u(n-1,m-1)+(n-1)*s_u(n-1,m) su(n,m)=su(n−1,m−1)+(n−1)∗su(n−1,m) 有符号的第一类斯特林数的递推式为 s s ( n , m ) = s s ( n − 1 , m − 1 ) − ( n − 1 ) ∗ s s ( n − 1 , m ) s_s(n,m)=s_s(n-1,m-1)-(n-1)*s_s(n-1,m) ss(n,m)=ss(n−1,m−1)−(n−1)∗ss(n−1,m) 证明是前面那个公式 ∑ k = 0 n s ( n , k ) x k = x n ↓ = x n − 1 ↓ ∗ ( x − n + 1 ) = ∑ k = 0 n − 1 s ( n − 1 , k ) x k + 1 − n ∗ ∑ k = 0 n − 1 s ( n − 1 , k ) x k \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^k k=0∑ns(n,k)xk=xn↓=xn−1↓∗(x−n+1)=k=0∑n−1s(n−1,k)xk+1−n∗k=0∑n−1s(n−1,k)xk 依次把 x m x^m xm在左右两边的系数提取出来得到 另外有这个式子:(证明在第二类斯特林数的博客里) x n ↓ = ∑ i = 0 n [ n i ] s x i x^{n\downarrow}=\sum_{i=0}^n\begin{bmatrix}n\\i\end{bmatrix}_sx^i xn↓=i=0∑n[ni]sxi 我们可以通过这个公式在 Θ ( n l o g 2 n ) \Theta(nlog^2n) Θ(nlog2n)的复杂度内用分治+FFT求出某个 n n n对应的所有 s u ( n , m ) s_u(n,m) su(n,m)值性质
除了一些比较容易想到的性质外,第一类斯特林数还有如下性质
s u ( n , 2 ) = ( n − 1 ) ! ∗ ∑ i = 1 n − 1 1 i s_u(n,2)=(n-1)!*\sum_{i=1}^{n-1}\frac{1}{i} su(n,2)=(n−1)!∗i=1∑n−1i1 ∑ k = 0 n s u ( n , k ) = n ! \sum_{k=0}^ns_u(n,k)=n! k=0∑nsu(n,k)=n! 容易发现,每一个排列都对应着一个轮换(相当于i到ai连一条边的一副图),然后枚举轮换里环的数量就好了应用
第一类斯特林数是一种在组合方面比较有用的数,很多问题都可通过它来解决,熟悉它的性质,才能熟练的运用到公式推导的过程中去
转载地址:https://blog.csdn.net/zhouyuheng2003/article/details/79026975 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月15日 20时56分19秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
DL入门(4):长短期记忆网络(LSTM)
2019-04-29
C++:快速排序
2019-04-29
剑指Offer题40:最小的k个数:快速排序,优先队列
2019-04-29
C++:冒泡排序
2019-04-29
剑指Offer题41:数据流的中位数:堆排序
2019-04-29
C++:继承
2019-04-29
剑指Offer题7:栈和队列
2019-04-29
剑指Offer题8:二分查找
2019-04-29
剑指Offer题9:斐波那契数列
2019-04-29
C++:多态
2019-04-29
2021-05-14
2019-04-29
2021-05-14
2019-04-29
2021-05-14
2019-04-29
设计模式的三大类别
2019-04-29
初学ToggleButton 点击按钮,更换按钮背景图片;再次点击,恢复之前背景图
2019-04-29
Android 四种绑定监听事件的方式
2019-04-29
ViewPager+Fragment 滑动菜单效果 实现步骤
2019-04-29
eclipse下Ctrl+H搜索并替换全项目字符串
2019-04-29