斯特林数
斯特林数
第二类斯特林数
第二类斯特林数记为 \(\begin{Bmatrix} n \\ k \end{Bmatrix}\),读作”\(n\) 子集 \(k\)“,表示把 \(n\) 个元素的集合划分为 \(k\) 个非空子集的方案数。或者说,把 \(n\) 个有标号小球放入 \(k\) 个无标号盒子的方案数。
第二类斯特林数的递推式如下:
第一行给出了递推的边界情况:把空集划分成 \(0\) 个非空子集的方案为 \(1\) 种,其它情况下,无法把一个非空集合划分成 \(0\) 个非空子集,因此 \(n > 0\) 时有 \(\begin{Bmatrix} n \\ 0\end{Bmatrix} = 0\)。
第二行体现了斯特林数的递推关系。把 \(n\) 个元素的集合划分为 \(k\) 个非空子集的方案可以分为两种:要么把第 \(n\) 个元素分到一个新的子集,有 \(\begin{Bmatrix} n - 1 \\ k - 1 \end{Bmatrix}\) 种方案;要么把第 \(n\) 个元素分到原有的 \(k\) 个子集中的一个,方案数为 \(k\begin{Bmatrix} n - 1 \\ k \end{Bmatrix}\)。因此 \(\begin{Bmatrix} n \\ k \end{Bmatrix}\) 就是二者的和。
性质
使用组合意义证明。\(x^{k}\) 可以看作把 \(k\) 个有标号小球放到 \(x\) 个有标号盒子的方案数(允许有的盒子不放):每个小球有 \(x\) 种放置方式,总的放置方式就是 \(x^{k}\)。枚举放置小球的盒子数量 \(i\),选择盒子的方案数为 \(\dbinom{x}{i}\)。把 \(k\) 个小球放到这 \(i\) 个盒子中,方案数为 \(\begin{Bmatrix} k \\ i \end{Bmatrix} i!\),这里乘上阶乘是因为盒子有标号,需要互相区分。所以等式得证。
此外,求和的上界取到 \(k\) 或者 \(x\) 都是可行的——实际上应该取到两者的最小值,但是 \(i\) 大于 \(\min(x, k)\) 时和式中的式子一定为 \(0\),所以无所谓。
第一类斯特林数
第一类斯特林数记为 \(\begin{bmatrix} n \\ k \end{bmatrix}\),读作”\(n\) 轮换 \(k\)“,表示把 \(n\) 个元素的集合划分为 \(k\) 个轮换的方案数。这个定义和第二类斯特林数有点像,但它把元素划分成轮换而非子集。
轮换有时也被称为”圆排列”,这是一个形象的叫法,因为一个轮换可以看作一个放在圆上的排列。这就意味着,把末尾的元素放到开头,得到的轮换是相同的:
一个只有一个元素的轮换和一个单元素集本质上相同;只有两个个元素的轮换和只有两个元素的集合本质上也相同,因为 \([1, 2] = [2, 1]\)。但轮换的大小大于 \(2\) 时,轮换和等大的集合就不同了,例如大小为 \(3\) 的集合 \(\{1, 2, 3\}\) 有两个不同的轮换:\([1, 2, 3]\) 和 \([2, 1, 3]\)。
这个性质给出:当 \(k = n\) 或 \(k = n - 1\) 时,\(\begin{bmatrix} n \\ k \end{bmatrix} = \begin{Bmatrix} n \\ k \end{Bmatrix}\),因为此时划分出的每个集合的大小都为 \(1\) 或 \(2\)。(实际上容易看出 \(\begin{bmatrix} n \\ n \end{bmatrix} = \begin{Bmatrix} n \\ n \end{Bmatrix} = 1\),\(\begin{bmatrix} n \\ n - 1 \end{bmatrix} = \begin{Bmatrix} n \\ n - 1 \end{Bmatrix} = \dbinom{n}{2}\)。)
下面我们导出第一类斯特林数的递推式,实际上它和第二类斯特林数的递推式很相似:
边界情况和第二类斯特林数相同:把空集划分成 \(0\) 个轮换有一种方法,而不能把非空集合划分成 \(0\) 个轮换。
把 \(n\) 个元素划分成 \(k\) 个轮换有两种方式:要么把第 \(n\) 个元素放到一个新轮换中,方案数为 \(\begin{bmatrix} n - 1 \\ k - 1 \end{bmatrix}\);要么把第 \(n\) 个元素放到一个原有的轮换中。第二种情况比第二类斯特林数的递推复杂一些,因为可以把元素插到一个轮换的不同位置,所以系数不是 \(k\)。但这个问题也不难解决:在一个大小为 \(m\) 的轮换中插入一个元素,有 \(m\) 种方式,容易验证得出的轮换都不同。由于轮换的大小总和为 \(n - 1\),所以总共有 \((n - 1)\begin{bmatrix}n - 1\\k\end{bmatrix}\) 种方式。
下降幂多项式
第二类斯特林数可以用于把通常幂转成下降幂。具体而言我们有:
可以用归纳法证明。
有时我们需要把一个通常幂多项式转成下降幂多项式。具体而言,给定 \(m\) 次多项式
我们希望把它转成
我们要做的就是对 \(0 \le k \le m\) 求出所有的 \(b_{k}\)。
根据通常幂转下降幂的恒等式,有
交换一下求和顺序有
所以 \(b_{i} = \sum_{j = i}^{m} a_{j} \begin{Bmatrix} j \\ i \end{Bmatrix}\)。
例题
难度大致升序。
I. [FJOI2016] 建筑师
(题目链接)求有多少个长度为 \(n\) 的排列,满足恰有 \(a\) 个前缀最大值和 \(b\) 个后缀最大值。
多测,数据组数 \(T \le 2 \times 10^{5}\),\(n \le 5 \times 10^{4}\),\(a, b \le 100\)。
首先观察到 \(n\) 必定是前缀最大值和后缀最大值。删去排列中的 \(n\),则排列分裂成两个更小的排列(可能为空)。由于 \(n\) 的分隔,所以这两个排列的前缀最大值和后缀最大值互不影响。因此,靠前的排列需要满足恰有 \(a\) 个前缀最大值,靠后的排列需要满足恰有 \(b\) 个后缀最大值。
设 \(f(i, j)\) 表示恰有 \(j\) 个前缀最大值的长度为 \(i\) 的排列数量。如果一个长度为 \(i\) 的排列有 \(j\) 个前缀最大值,把它翻转以后,得到的新排列就有 \(j\) 个后缀最大值。因此,有 \(j\) 个前缀最大值的长度为 \(i\) 的排列和有 \(j\) 个后缀最大值的长度为 \(i\) 的排列一一对应,所以不必专门设状态计算后缀最大值数量为特定值的排列数。
假设已经计算出了 \(f(i, j)\),考虑如何统计答案。枚举 \(n\) 之前的元素数量,有
如何计算 \(f(i, j)\) 呢?比较巧妙的想法是考虑在排列中加入一个更小的数,如果加在开头,那么前缀最大值的数量增加 \(1\),否则加在其它任何位置都不会使前缀最大值的数量增加。所以有
容易得出边界情况是 \(f(i, j) = [i = 0]\)。
我们发现这个递推式和第一类斯特林数的递推式完全相同!也就是说 \(f(i, j) = \begin{bmatrix} i \\ j \end{bmatrix}\)。因此
为什么 \(f(i, j) = \begin{bmatrix} i \\ j \end{bmatrix}\)?能否找到一个组合意义的解释呢?
对于一个排列,设它的长度为 \(i\),有 \(j\) 个前缀最大值。从所有前缀最大值的前面断开,则排列分为 \(j\) 段。这实际上和把 \(i\) 个元素划分成 \(j\) 个轮换的方式一一对应:对于分出的一个轮换,在排列中,必须满足最大值在前,否则轮换中的其它数也可能会成为前缀最大值。
继续优化现有的式子。沿用我们找到的组合意义,一个满足条件的排列可以视作:从 \(\{1, 2, \cdots , n\}\) 中先取出 \(n\),再在剩下的 \((n - 1)\) 个数中取出 \((a + b - 2)\) 个轮换,其中 \((a - 1)\) 个放到 \(n\) 之前,提供前缀最大值,剩下的提供后缀最大值。由于要满足轮换的最大值递增(或递减,如果轮换放在 \(n\) 之后),所以确定哪些轮换放在 \(n\) 之前以后,放置轮换的顺序唯一确定。因此有
设 \(w\) 为所有测试数据中 \(a\) 和 \(b\) 的最大值,则可以在 \(O(nw)\) 的时间内预处理,在 \(O(1)\) 的时间内回答每组询问。
II. [MX-X8-T5]「TAOI-3」蓝宝石的存在证明
这是一道有趣的计数题,第二类斯特林数作为工具出现。
先找到一种简洁的方式刻画“好的”图,刻画方式越简洁越好,因为简洁有利于我们找到问题的本质。
题目中说一个“好的”图恰好有一种划分方式,这包含了两个信息:划分方式的存在性和唯一性。我们分别考虑这两点。由于树的情况比较简单,所以先研究树的情况,再扩展到一般的无向连通图。
首先,可以证明:\(n \ge 2\) 时,任意树都存在划分方式。
用归纳法证明。当 \(n = 2\) 时,整棵树可以划分成一个紧密的连通块。假设 \(n \le k\) 时成立,接下来要证明当 \(n = k + 1\) 时也成立。任取树上的一个叶子节点 \(v\),设与它唯一相连的节点为 \(u\)。删去 \(u\),树分裂为若干个连通块。对于大小不小于 \(2\) 的连通块,根据归纳假设,这些连通块都存在划分方式。对于大小为 \(1\) 的连通块(即孤点),可以把它们和 \(u\) 划分到一个连通块中。由于这个连通块至少包含两个节点(\(u\) 和 \(v\)),所以它也存在划分方式。证毕。
这个结论容易扩展到任意无向连通图:\(n \ge 2\) 时,任意无向连通图都存在划分方式。任取连通图的一棵生成树,忽略非树边,根据上文的结论,这棵生成树存在划分方式。加上非树边,不影响划分方式的存在性。(具体而言,对于生成树的一个划分方式,如果非树边连接了两个连通块,那么完全不影响;如果非树边的两端在一个连通块内,只可能让该连通块的直径变小,仍然不影响。)
接下来探讨什么样的树只有唯一一种划分方式。这里比较巧妙的想法是:考虑一个不与叶子节点相邻的节点 \(u\)(如果存在)。删去 \(u\),树分裂为若干个连通块。由于 \(u\) 不与叶子节点相邻,所以所有分裂出的连通块的大小都不小于 \(2\)。因此,把 \(u\) 分到任意一个连通块中,都存在划分方式,而且把 \(u\) 划分到不同连通块得到的划分方式显然不同,这就不满足唯一性。所以我们得到了划分方式唯一的必要条件:所有非叶节点都与至少一个叶子节点相邻。(可以视为有一棵树作为“骨架”,骨架上的每一个点都悬挂着至少一个点)
我们还可以证明这实际上也是充分条件。对于每个叶子节点,它都必须和它唯一相邻的节点划分到一个连通块中。而如果把骨架上的两个点分到一起,它们相连的叶子节点间的距离就为 \(3\),违反了限制,所以这是不合法的。因此唯一合法的划分方式就是:把骨架上的节点和与它相连的叶子节点划分为一个连通块。
这个结论能扩展到任意的连通图吗?
不妨定义一般连通图上的叶子节点为度数为 \(1\) 的点。考虑图中一个不与叶子节点相邻的节点 \(u\),删去 \(u\) 之后,如果图分裂之后不连通,那么根据在树情况下的讨论,划分方式就不唯一。
否则删去 \(u\) 之后图仍然连通。由于 \(u\) 不是叶子节点,所以 \(u\) 至少和连通块中的两个点相邻。那么 \(u\) 与这两个点之间的边和连通块中两点的路径构成一个环,于是整个图可以看作一个环往外挂了若干个连通块。如果存在一个节点,它外挂的连通块的大小都不小于 \(2\),那么删去这个点,就变成了每个连通块大小都不小于 \(2\) 的情况,有多个划分方式。否则忽略所有外挂的大小不小于 \(2\) 的连通块,则整个图可以视为一个环外挂若干个(可能是 \(0\) 个)叶子节点。由于 \(u\) 不与任何叶子节点相邻,所以把 \(u\) 和与其相邻的两个节点中的任意一个划分到一起都可行。需要注意的是如果 \(n = 3\) 且图是一个三元环,这个讨论不成立,此时只有唯一一种划分方式,就是把整个图划分为一个连通块,所以要特判这种情况。
综上所述,我们证明了,对于一般的无向连通图,划分方式唯一的必要条件是不存在不与叶子节点相邻的节点。充分性容易仿照树的情况证明。
现在我们终于找到了一种简洁的方式来刻画好的图,下面来列式计算方案数。
对于 \(n\) 个点的图,枚举叶子节点的数量 \(m\),则有 \(\dbinom{n}{m}\) 种方式选择叶子节点。由于每个骨架节点都要与至少一个叶子节点相邻,所以要把 \(m\) 个叶子节点划分成 \((n - m)\) 个非空子集。注意,这里的子集是有序的,所以方案数在第二类斯特林数的基础上还要乘上排列数,即 \(\begin{Bmatrix} m \\ n - m \end{Bmatrix} \times (n - m)!\)。最终还需要计算骨架节点连边的方案数,设 \(n\) 个骨架节点连边的方案数为 \(f(n)\)。如果图是树,那么骨架节点也必需构成树,根据凯莱公式有 \(f(n) = n^{n - 2}\)。如果图是一般的连通图,则骨架节点也只需是连通图,此时 \(f(n)\) 的计算是一个经典问题,详见 此处。
最终我们得到:
\(O(n^{2})\) 时间预处理第二类斯特林数,然后就可以在 \(O(n)\) 时间内回答每个询问。
III. [集训队互测 2011] Crash 的文明世界
(题目链接)给定一棵有 \(n\) 个节点的树和常数 \(k\),对每个节点,求出所有节点到它的距离的 \(k\) 次方和。
两点的距离定义为两点之间唯一简单路径的边数。
\(n \le 5 \times 10^{4}\),\(1 \le k \le 150\)。
使用二项式定理进行树形 dp,容易得到一个在 \(O(nk^{2})\) 时间内求出单个点答案的做法。具体而言,设 \(f(u, i)\) 表示 \(u\) 子树内所有点到 \(u\) 的距离的 \(i\) 次方和。由于 \((a + 1)^{k} = {\Large\sum}_{i = 0}^{k}\dbinom{k}{i} a^{i}\),所以有如下转移方程:
需要说明的是,加上 \([i = 0]\) 是为了统计 \(u\) 本身的贡献:\(u\) 到自身的距离为 \(0\),而在组合数学中一般认为 \(0^{i} = [i = 0]\),因为 \(0^{0}\) 可以视为空乘积。可以用二项式定理来直观地说明这点:
如果 \(0^{0} = 1\),这个等式才成立。从二项式定理的组合意义上来说,\(i = 0\) 时相当于从 \(k\) 个括号中选择了 \(0\) 个 \(0\) 和 \(k\) 个 \(1\) 相乘,因此把 \(0^{0}\) 视为空乘积是恰当的。
回到正题。使用换根 dp 可以把这个解法的总时间复杂度优化到 \(O(nk^{2})\),但仍然不能通过。
到这一步二项式定理已经被榨干了,所以正解和二项式定理其实没什么关系(
换一种方式把 \(k\) 次幂拆开。根据斯特林数的性质,有
因此 \(u\) 的答案为
由于第二个和式中只有 \(\dbinom{\operatorname{dist}(u, v)}{i}\) 和 \(v\) 有关,这启示我们交换求和顺序:
因此只有对所有 \(u\) 和 \(1 \le i \le k\) 求出 \({\Large \sum}_{v \in V}\limits \dbinom{\operatorname{dist}(u, v)}{i}\) 即可。设 \(f(u, i)\) 表示 \({\Large \sum}_{v \in T(u)}\limits \dbinom{\operatorname{dist}(u, v)}{i}\),根据组合数的递推式,有
这样转移是 \(O(1)\) 的。
仍然使用换根 dp,就可以在 \(O(nk)\) 的时间内通过本题。
IV. [省选联考 2020 A 卷] 组合数问题
先看 \(m = 0\) 的情况。此时 \(f(k)\) 的值恒为 \(a_{0}\),因此和式变成
根据二项式定理有 \(\sum_{k = 0}^{n}\limits x^{k} \times \dbinom{n}{k} = (x + 1)^{n}\),所以原式变为
那么 \(m > 0\) 时怎么做呢?先把多项式拆开,根据分配律把多项式的求和提到外层:
到这里我们发现 \(k^{i}\) 与 \(x^{k}\) 或 \(\dbinom{n}{k}\) 的乘积不能转化为利于求和的形式。但下降幂和组合数的积有一个优雅的结果:
简单地把组合数和下降幂展开即可证明:
所以,先把 \(f(k)\) 转成下降幂多项式,设下降幂多项式中 \(k^{\underline{i}}\) 的系数为 \(b_{i}\),即
那么原式变为
对于第二个和式,把下降幂和组合数相乘,得到
此时 \(n^{\underline{i}}\) 对于第二个和式是常数,我们可以先忽略它。我们希望能像 \(m = 0\) 时那样运用二项式定理简化第二个和式,这需要组合数的下指标和求和的指标相同。
用 \(k + i\) 代替 \(k\),那么和式变成
忽略 \(k < 0\) 的情况,继续整理得
终于可以用二项式定理了,上式变成:
代回,我们要求的式子就是:
在 \(O(m^{2})\) 的时间内预处理斯特林数,再用上文提到的方法计算下降幂的系数 \(b\),总时间复杂度为 \(O(m^{2})\)。(忽略求逆元的时间。)