斯特林数相关
1. 基础
1.1 第一类斯特林数
1.1.1 定义
第一类斯特林数 \({n \brack k}\),指将 \(n\) 个数放入 \(k\) 个环中(环无区分)的方案数。
1.1.2 递推式
说明:
我们考虑最后一个数的位置,独立成环则为后一项,否则我们可以加到 \(n-1\) 个数中的某个数后面去,得到这个递推式。
1.2 第二类斯特林数
1.2.1 定义
第二类斯特林数 \({n \brace k}\),指将 \(n\) 个数放入 \(k\) 个盒子(盒子无区分)的方案数。
1.2.2 递推式
说明:
我们考虑最后一个数的位置,自己一个盒子则为后一项,否则我们可以加到 \(k\) 个盒子中的某个盒子中。
1.2.3 通项公式
第二类斯特林数通项公式:
证明:
见容斥原理学习笔记。
2. 常用公式
2.1 第一类斯特林数与阶乘
证明:
double counting,考虑计算有多少个 \(1 \sim n\) 的置换,显然有 \(n!\) 个。如果我们枚举置换中环的个数,就是 \(\sum_{k=0}^n {n \brack k}\),所以二者相等。
2.2 上下阶乘幂与普通数幂的关系
证明:
先证第一个,double counting,将 \(n\) 个数放入 \(x\) 个盒子中(盒子有区别),显然可以是 \(x^n\),枚举哪些盒子非空,再用算这些盒子的情况,答案是 \(\sum_{k=1}^n {n \brace k}x^{\underline{k}}\)。
剩下的三个式子可以由 \(x^{\overline{k}}=(-1)^{k}(-x)^{\underline{k}}\) 推出。
3. 斯特林数快速计算
前置知识:多项式学习笔记
3.1 第一类斯特林数·行
不妨设 \(f_n(x) = x^{\overline{n}}\),根据上面的公式,我们要求的就是这个多项式的系数。
注意到 \(x^{\overline{2n}} = x^{\overline{n}}(x + n)^{\overline{n}}\),考虑倍增,我们得到:\(f_{2n}(x) = f_n(x)f_n(x + n)\)。
由于多项式的卷积和平移都是可以在 \(O(n \log n)\) 内完成的,所有总时间复杂度也是 \(O(n \log n)\)。
3.2 第二类斯特林数·行
两种方法。
我们可以考虑 \(f(x) = x^n\) 的下降幂系数,可以用快速幂在 \(O(n \log n)\) 内求出 \(f(0) \sim f(n)\),然后用下降幂多项式的插值在 \(O(n \log n)\) 插回去得到答案。
我们也可以直接用通项公式来做,推一下式子可以得到:
这就是一个卷积就完事儿了。这也是为什么只有这道题是紫题。
3.3 第一类斯特林数·列
考虑到第一类斯特林数实际上是若干个原排列的组合,我们先考虑圆排列的指数型生成函数,即:
所以我们只要求出下面这个多项式的系数即可:
然而由于这个快速幂时常数项为 \(0\),所以需要快速幂加强版的技巧来做。
3.4 第二类斯特林数·列
同样,考虑 EGF 会发现其实就是 \(e^x - 1\),所以我们要求的就是 \(\frac{(e^x - 1)^k}{k!}\) 即可,和上面类似。
4. 题目
CF932E Team Work
\(n \le 10^9, k \le 5000\),计算
再结合第二类斯特林数递推式便能计算。
P8143 [JRKSJ R4] Stirling
求 \(\sum_{2|k}{n \brack k}\)。
很妙,要用函数的思维。
我们已知:\( x^{\overline{n}} = \sum_{k=1}^n{n \brack k}x^k \)。现在将 \(x = 1\) 和 \(x=-1\) 分别带入,得到的就是偶数项与奇数项的差,显然差是 \(0\),和是 \(n!\),所以答案就是 \(n!\) 的一半。
有限制置换
求所以满足要求的 \(n\) 长度置换:
- \(1\) 不是独立的环。
- 环的个数不超过 \(k\)。
我们先枚举有多少个环,假设有 \(j\) 个环,则 \({n \brack j}-{n-1 \brack j-1}\) 就是所有情况减去 \(1\) 单独成环的情况。最后累加即可。
P4609 [FJOI2016] 建筑师
容易发现,整个序列必然是中间是 \(n\),然后左右两边分别是 \(A-1\) 个递增的和 \(B-1\) 个下降的。
我们不妨把 \(1 \sim n-1\) 分成 \(A+B-2\) 组(非空)。
首先我们要计算将这些组分别分到前面和后面。
然后分完后显然是每组最大的作为递增或递减,并且剩下的数可以随便填,不同的填法等价于圆排列的个数。
所以我们可以用第一类斯特林数与组合数,答案就是 \(\binom{A+B-2}{A-1}{n-1 \brack A+B-2}\)。
CF960G Bandit Blues
和上道题完全一样,但是数据范围更大,第一类斯特林数需要用多项式来求。
P4091 [HEOI2016/TJOI2016] 求和
记 \(g_n = \sum_{i=0}^n{n \brace i}i!2^i\)
考虑组合意义,\(g_n\) 相当于把 \(n\) 个球放入若干盒子,盒子有顺序,且有两种颜色。
这样我们考虑枚举最后一个盒子,可以得到递推式:
将其变化一下得到:
设 \(G(x) = \sum_n\frac{g_n}{n!}x^n\),\(F(x) = \sum_{n}\frac{2}{n!}\),则我们就可以知道 \(G(x) = G(x)F(x) + 1\),所以 \(G(x) = \frac{1}{1 - F(x)}\),多项式求逆即可。
QOJ1285 Strling Number
首先我们考虑 \(S_n(x) = x^{\overline{n}}\) 这个函数的系数就是第一类斯特林数。
我们显得出 \(S_n(x)\) 的一个递归形式。
设 \(q = \lfloor \frac{n}{p}\rfloor\),\(r = n \bmod p\),则:
我们需要一个强有力的引理:\(x^{\overline{p}} \equiv x^p - x \pmod p\),\(p\) 是素数。
证明考虑构造 \(S(x) = x^{\overline{p}}\) 和 \(F(x) = x^P - x\),则 \(F(x) - S(x)\) 的邻点个数大于这个多项式的次数,所以这个多项式恒等于 0,所以 \(F(x) = S(x)\)。
根据这个引理容易得到:
根据这个式子,我们得到第一类斯特林数的简化公式: