一、为什么学斯特林数?
Mermaid · 渲染中(下方为源码)
graph LR A[第一类] --> B[圆排列/轮换] A2[第二类] --> B2[集合划分] B2 --> C[Bell数=行和]
两类斯特林数在组合数学与计数 DP 中高频出现:
- 第一类 (s(n,k)):n 个元素分成 k 个圆排列(轮换)
- 第二类 (S(n,k)):n 个元素划分成 k 个非空无序集合
常用转换:x^n = Σ S(n,k)·x↑(k)(上升阶乘)。
二、递推式
第一类(带符号):s(n,k) = s(n-1,k-1) - (n-1)·s(n-1,k)
第一类(无符号):c(n,k) = c(n-1,k-1) + (n-1)·c(n-1,k)
第二类:S(n,k) = S(n-1,k-1) + k·S(n-1,k),边界 S(0,0)=1。
三、实现(第二类为例)
// S[n][k] 模 mod
for (int i = 0; i <= n; i++) Arrays.fill(S[i], 0);
S[0][0] = 1;
for (int i = 1; i <= n; i++)
for (int k = 1; k <= i; k++)
S[i][k] = (S[i - 1][k - 1] + (long) k * S[i - 1][k]) % MOD;四、行/列公式与生成函数
- 第二类行和:(贝尔数)