斯特林数

斯特林数(Stirling number)

六眼飞鱼酱① 提交于 2020-02-04 02:35:23
在组合数学,Stirling 数可指两类数,第一类Stirling 数和第二类 Stirling 数,都是由18世纪数学家 James Stirling 提出的。 Stirling 数有两种,第一类和第二类Stirling 数 第一类斯特林数: 形如 $\left[\begin{matrix}n\\m\end{matrix}\right]$, 也写作 $s(n,k)$ 组合意义: $s(n,k)$ 表示吧 $n$个数 分成 $k$组 ,每组是一个 环 ,求分成的方案数。 也就是一个轮子,怎么转都是一样的,如:1,2,3,4 和 4,1,2,3 只算一种 方案。 递推式: $$s(n+1,2)=s(n,1)+s(n,2)\cdot n$$ 即要么自成一个环,要么加入其它$k$个环,可以插入$n-1$个位置。(每两个数之间) 当然边界条件 $\left[\begin{matrix}0\\0\end{matrix}\right]=1$ 性质: 1. $s(n,1)=(n-1)!$ 2. $s(n,2)=(n-1)!\times\sum_{i=1}^{n-1}\frac{1}{i}$ 3. $\sum_{i=0}^n s(n,k)=n!$ 证明: 1. 显然,我们把$n$个元素排列起来,有$n!$种可能,首尾相接即可得到一个环。这里面每种情况重复了$n$次,因为可以旋转$n$次,所以除以

CF961G Partitions(第二类斯特林数)

ε祈祈猫儿з 提交于 2020-02-04 02:32:02
题目 CF961G 前置 斯特林数 \(\Longrightarrow\) 斯特林数及反演总结 做法 相信大家能得出一个一眼式: \[Ans=\sum\limits_{i=1}^n w_i\sum\limits_{s=1}^n s\cdot C_{n-1}^{s-1}\begin{Bmatrix}k-1\\n-s\end{Bmatrix}\] 然后就开始推式: \[\begin{aligned}\\ Sum&=\sum\limits_{s=1}^n s\cdot C_{n-1}^{s-1}\begin{Bmatrix}n-s\\k-1\end{Bmatrix}\\ &=\sum\limits_{s=1}^n s\cdot C_{n-1}^{s-1}\sum\limits_{i=0}^{k-1}\frac{(-1)^i}{i!}\frac{(k-i-1)^{n-2}}{(k-i-1)!}\\\ &=\sum\limits_{i=0}^{k-1}\frac{(-1)^i}{i!(k-i-1)!}\sum\limits_{s=1}^n s\cdot C_{n-1}^{s-1}(k-i-1)^{n-s}\\ &=\sum\limits_{i=0}^{k-1}\frac{(-1)^i}{i!(k-i-1)!}(\sum\limits_{s=1}^nC_{n-1}^{s-1}(k-i-1)^

[总结] 第一类斯特林数

时光总嘲笑我的痴心妄想 提交于 2020-02-04 01:58:24
第一类斯特林数 \(\begin{bmatrix}n\\m\end{bmatrix}\) ,将 \(n\) 个元素划分为 \(m\) 个圆排列的方案数。 递推 递推式可以枚举最后一个元素是否放一个新的排列: \(\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\times \begin{bmatrix}n-1\\m\end{bmatrix}\) 下面用 \(s(n,m)\) 表示 \(\begin{bmatrix}n\\m\end{bmatrix}\) 。 性质 \[ \begin{aligned}n!=\sum_{i=0}^n s(n,i)\end{aligned} \] 证明:考虑其组合意义。一个排列唯一对应一个置换,而一个置换唯一对应一组轮换。比如排列 \((1,5,2,3,4)\) ,就可以看作轮换组 \([1][2,5,4][3]\) 。如果两个排列不同,那他们对应的轮换中,必定有一个元素的下一个元素不同,故排列与轮换一一对应。所以等式右侧的式子就是有 $0\sim n $ 个轮换的方案数。 求法 现在要快速求出第一类斯特林数的某一行。 直接给出定义, \(s(n,*)\) 这东西的生成函数等于 \(\prod\limits_{i=0}^{n-1} (x+i)\)

浅谈斯特林数及其应用

孤街醉人 提交于 2019-12-27 20:27:06
第一类斯特林数 定义 第一类Stirling数表示将 n 个不同元素构成m个圆排列的数目。 设有多项式 \[ [x]_n = x(x-1)(x-2)\dots(x-n+1) \] \[ =s(n,0)+s(n,1)x+s(n,2)x^2+\dots +s(n,n)x^n \] 则称 \(s(n,0),s(n,1),\dots,s(n,n)\) 为 第 \(1\) 类斯特林数 。 递推式 \[ [x]_{n+1}=[s(n,0)+s(n,1)x+s(n,2)x^2+\dots +s(n,n)x^n](x-n) \] \[ =s(n+1,0)+s(n+1,1)x+\dots+s(n+1,n+1)x^{n+1} \] 显然有 \[ s(n,r)=s(n-1,r-1)+(n-1)s(n-1,r) \] 考虑其组合意义,最后一个球可以单独构成一个圆排列,也可以插入前面某一个球的一侧。 若单独放,则有 \(s(n-1,r-1)\) 种放法;若放在某个球的一侧,则有 \((n-1)s(n-1,r)\) 种放法。 第二类斯特林数 定义 \(n\) 个有区别的球放到 \(m\) 个相同的盒子里,要求无一空盒,其不同的方案数用 \(S(n,m)\) 来表示,称为 第2类斯特林数 ,即 \(S(n,m)\) 也就是将 \(n\) 个数拆分成非空的 \(m\) 个部分的方案数。 \(E.g.\) 红、黄

斯特林数&斯特林反演

最后都变了- 提交于 2019-12-26 01:24:10
第一类斯特林数 定义 第一类Stirling数 \(s(n,m)\) ,也可记为 \(\begin{bmatrix}n\\m\end{bmatrix}\) 。 第一类Stirling分为无符号第一类Stirling数 \(s_u(n,m)\) 和带符号第一类Stirling数 \(s_s(n,m)\) 。 他们分别表现为其升阶函数和降阶函数的各项系数,形式如下: \[ x^{n\downarrow}=x\cdot (x-1)\cdot (x-2)\cdots (x-n+1)=\sum_{k=0}^ns_s(n,k)\cdot x^k\\ x^{n\uparrow}=x\cdot (x+1)\cdot (x+2)\cdots(x+n-1)=\sum_{k=0}^ns_u(n,k)\cdot x^k \] 无符号Stirling数更为常用,表示将 \(n\) 个不同元素构成 \(m\) 个圆排列的数目。 有无符号Stirling之间有关系式 \(s_s(n,m)=(-1)^{n+m}\cdot s_u(n,m)\) 。 递推式 无符号第一类Stirling数 设元素有编号 \(1,2,...,n\) ,则将 \(n\) 个元素构成 \(m\) 个圆有两种情况: ①把第 \(n\) 个元素单独作为一个圆,用前 \(n-1\) 个元素构成 \(m-1\) 个圆,方案数 \(\begin

斯特林数(斯特林反演)学习笔记

一个人想着一个人 提交于 2019-12-26 01:23:42
引入 关于斯特林数的定义可以看看这里: https://www.cnblogs.com/hbyer/p/10576904.html,这是我以前写的 。 当然也可以上百度看看定义。 这里不加说明的给出递推式: \[ \begin{align}s_1(n,k)&=(n-1)\cdot s_1(n-1,k)+s_1(n-1,k-1)\\ s_2(n,k)&=k\cdot s_2(n-1,k)+s_2(n-1,k-1)\end{align} \] 卷积求第二类斯特林数 首先有一个组合意义很明显的式子: \[ n^k=\sum_{i=0}^{k}s_2(k,i)\binom{n}{i}i! \] 就是说 \(n\) 个位置填 \(k\) 中颜色,我们可以分成若干组,每组颜色不同。 我们可以把后面的值为 \(0\) 的项补全: \[ n^k=\sum_{i=0}^{n}s_2(k,i)\binom{n}{i}i! \] 对其进行二项式反演: \[ s_2(k,n)n!=\sum_{i=0}^{n}(-1)^{n-i}\binom{n}{i}i^k \] 这个可以写成卷积形式,顺便把变量换下: \[ s_2(n,k)=\sum_{i=0}^k\frac{(-1)^{k-i}}{(k-i)!}\cdot \frac{i^n}{i!} \] 阶乘幂 阶乘幂的定义是这样的: 上升幂: \(x^{

HDU4372(第一类斯特林数)

泄露秘密 提交于 2019-12-05 05:02:49
题意:N座高楼,高度均不同且为1~N中的数,从前向后看能看到F个,从后向前看能看到B个,问有多少种可能的排列数。 0 < N, F, B <= 2000 首先我们知道一个结论:n的环排列的个数与n-1个元素的排列的个数相等,因为P(n,n)/n=(n-1)!。 可以肯定,无论从最左边还是从最右边看,最高的那个楼一定是可以看到的. 假设最高的楼的位置固定,最高楼的编号为n,那么我们为了满足条件,可以在楼n的左边分x-1组,右边分y-1组,且用每 组最高的那个元素代表这一组,那么楼n的左边,从左到右,组与组之间最高的元素一定是单调递增的,且每组中的最高元 素一定排在该组的最左边,每组中的其它元素可以任意排列(相当于这个组中所有元素的环排列)。右边反之亦然。 然后,可以这样考虑这个问题,最高的那个楼左边一定有x-1个组,右边一定有y-1个组,且每组是一个环排列,这就引出 了第一类Stirling数(n个人分成k组,每组内再按特定顺序围圈的分组方法的数目)。 我们可以先把n-1个元素分成x-1+y-1组,然后每组内部做环排列。再在所有组中选取x-1组放到楼n的左边。所以答案是 ans(n, f, b) = C[f + b - 2][f - 1] * S[n - 1][f + b - 2]; #include <iostream> #include <string.h> #include

第一类斯特林数、第二类斯特林数、贝尔数总结+模板

耗尽温柔 提交于 2019-11-28 10:59:15
转载 https://blog.csdn.net/sxh759151483/article/details/83420939 第一类斯特林数 解决问题:给n个元素,求出k个环排列的方法数 Stirling[n][k] 1 1 1 2 3 1 6 11 6 1 24 50 35 10 1 120 274 225 85 15 1 720 1764 1624 735 175 21 1 5040 13068 13132 6769 1960 322 28 1 40320 109584 118124 67284 22449 4536 546 36 1 362880 1026576 1172700 723680 269325 63273 9450 870 45 1 const int maxn = 21; ll Stirling[maxn][maxn], fac[maxn] = {1}; void init() { for(ll i = 1; i < maxn; i++) fac[i] = fac[i - 1] * i; Stirling[0][0] = 0; Stirling[1][1] = 1; for(ll i = 2; i < maxn; i++) { for(ll j = 1; j <= i; j++) { Stirling[i][j] = Stirling[i - 1][j - 1]