组合数学(特殊数)

前言

本文主要记录一些组合数学中常用(?)的特殊数,背景是清华学长回校讲课。

斯特林数

斯特林数有两类,我们先从比较常见的第二类开始介绍。

第二类斯特林数

我们用 \(n\brace k\) 表示将 \(n\) 个元素划分成 \(k\)非空子集的方案数。

一些特殊值

  • \({n\brace0}=[n=0]\)
  • \({n\brace1}={n\brace n}=1(n>0)\)
  • \({n\brace2}=2^{n-1}-1(n>0)\)
  • \({n\brace n-1}={n\choose2}\)

递推式

\[{n\brace k}=k{n-1\brace k}+{n-1\brace k - 1} \]

考虑第 \(n\) 个元素放在哪里。

生成函数

考虑一个盒子装 \(n\) 个物品且盒子非空方案数是 \([n>0]\)。我们可以写出它的 \(EGF\) 为:

\[F(x)=\sum_{n=1}^{\infty}{x^n\over n!}=e^x-1 \]

\(EGF\) 卷积的组合意义可以知道:\(F^k(x)\) 就是 \(n\) 个有标号物品放到 \(k\) 个有标号盒子的 \(EGF\)。但是第二类斯特林数是放到无标号盒子中的,所以还要去掉一个 \(k!\),也就是:

\[{1\over n!}{n\brace k}=[x^n]{(e^x-1)^k\over k!} \]

通项公式

\[{n\brace k}={1\over k!}\sum_{i=0}^k(-1)^i{k\choose i}(k-i)^n=\sum_{i=0}^k{(-1)^{k-i}i^n\over i!(k-i)!} \]

证明:(注意以下的定义中盒子均有标号,但是斯特林数的定义中盒子无标号)先假设盒子可以为空,则有 \(g_i=i^n\),然后考虑盒子不为空,根据容斥原理可以得到:\(g_i=\sum\limits_{j\le i}{i\choose j}f_j\),其中 \(f_i\) 表示的是盒子不为空且有标号的方案数。然后就可以愉快地进行二项式反演啦:

\[\begin{aligned} f_k&=\sum_{i=0}^k(-1)^{k-i}{k\choose i}g_i\\ &=\sum_{i=0}^k(-1)^{k-i}{k\choose i}i^n\\ &=\sum_{i=0}^k{(-1)^{k-i}\times k!i^n\over(k-i)!i!} \end{aligned} \]

最后再去掉标号就得到通项公式如下:

\[{n\brace k}=\sum_{i=0}^k{(-1)^{k-i}i^n\over(k-i)!i!} \]

至于如何快速求,就需要用到 \(\text {FFT}\) 了,时间复杂度 \(O(n\log n)\)

一点点小性质

介绍:这是一个与高阶差分有关的东西,具体长这样:

\[\Delta^mx^n|_{x=0}=m!{n\brace m} \]

证明:

\[\begin{aligned} \Delta^mx^n|_{x=0}&=\sum_{k=0}^m{m\choose k}(-1)^{m-k}(m-k)^n\\ m!{n\brace m}&=\sum_{k=0}^m{m\choose k}(-1)^{m-k}k^n\\ \end{aligned} \]

上面的换一下枚举方式(改倒序)即可。

第一类斯特林数

我们用 \({n\brack k}\) 表示将 \(n\) 个元素排成 \(k\) 轮换的方案数。

一些特殊值

  • \({n\brack0}=[n=0]\)
  • \({n\brack n}=1(n>0)\)
  • \({n\brack 1}=(n-1)!(n>0)\)
  • \({n\brack n-1}={n\choose2}\)

递推式

\[{n\brack k}=(n-1){n-1\brack k}+{n-1\brack k-1} \]

考虑第 \(n\) 个元素在轮换中所处的位置,其可以插到任何一个元素后面,也可单开一个轮换。

生成函数

可以类比第二类斯特林数,我们依然先考虑只有一个轮换的情况,\(k=1\)\({n\brack 1}=(n-1)!\)\(\text{EGF}\)

\[\begin{aligned} F(x)&=\sum_{n=1}^\infty(n-1)!{x^n\over n!}\\ &=\sum_{n=1}^\infty{x^n\over n}=-\ln(1-x) & (*) \end{aligned} \]

对于 \((*)\) 处也许会有读者感到疑惑(也有可能就是笔者菜?),在此稍微解释一番。我们可以观察这个 \(\sum\),能发现 \({x^n\over n}\) 中分母与指数相同,因为我们想把这个东西写成封闭形式,所以我们可以对其求导,因为这样分母就能抵消,然后就变成 \(\sum\limits_{n=0}^\infty x^n\) 了。一点也不仔细一瞧,这不一眼那啥就做完了吗?

我们还可以继续思考,什么东西求导会有类似的形式呢?有的兄弟,有的!这样的封闭形式还有一个!我们对 \(\ln(x)\) 求导有 \(\ln(x)'={1\over x}\),于是我们换一下元变一变符号就得到上面的等式了!

有了以上内容,我们可以得到 \(k\)无标号轮换的 \(\text{EGF}\) 为:

\[{f^k(x)\over k!}={(-1)^k\ln^k(1-x)\over k!} \]

即:

\[{1\over n!}{n\brack k}=[x^n]{(-1)^k\ln^k(1-x)\over k!} \]

通项公式

我把东西放在这里懒得搬过来了

一行之和

因为一个有 \(n\) 个元素的排列和一个 \(n\) 个元素的置换一一对应,于是对所有置换中的轮换数之和有:

\[\sum_{k=0}^n{n\brack k}=n! \]

斯特林数的一些常用公式

这里面的公式通常和一些奇奇怪怪的组合数之类的搭配使用,其中普通幂与其他幂之间的转化最常见,但本文也许会不限于此。其中普通幂转下降幂会给出证明,而其他有关幂之间的转换证明可参考证明。

  1. 普通幂转下降幂:

\[x^n=\sum_{k=0}^n{n\brace k}x^\underline k=\sum_{k=0}^n{n\brace k}{x\choose k}k! \]

证明:

使用数学归纳法,我们可以观察到:

\[x^\underline{k+1}=x^\underline k(x-k)\Rightarrow x\cdot x^\underline k=x^\underline{k+1}+kx^\underline k \]

于是有:

\[\begin{aligned} x\cdot x^{n-1}&=x\cdot\sum_{k=0}^{n-1}{n-1\brace k}x^\underline k\\ &=\sum_{k=0}^{n-1}{n-1\brace k}x^\underline{k+1}+\sum_{k=0}^{n-1}{n-1\brace k}kx^\underline k\\ &=\sum_{k=1}^{n}{n-1\brace k-1}x^\underline k+\sum_{k=1}^{n-1}{n-1\brace k}kx^\underline k\\ &=\sum_{k=1}^{n}({n-1\brace k-1}x^\underline k+k{n-1\brace k})x^\underline k\\ &=\sum_{i=1}^{n}{n\brace k}x^\underline k \end{aligned} \]

  1. 上升幂转普通幂:

\[x^\overline n=\sum_{k=0}^n{n\brack k}x^k \]

  1. 下降幂转普通幂:

\[x^\underline n=\sum_{k=0}^n(-1)^{n-k}{n\brack k}x^k \]

证明考虑两边带入 \(-x\) 然后变成上升幂证。

  1. 普通幂转上升幂:

\[x^n=\sum_{k=0}^n(-1)^{n-k}{n\brace k}x^\overline k \]

  1. 反转公式:

\[\sum_k{n\brace k}{k\brack m}(-1)^{n-k}=[n=m] \]

\[\sum_k{n\brack k}{k\brace m}(-1)^{n-k}=[n=m] \]

证明用普通幂先转上升幂再用上升幂转普通幂,下面的就用普通幂和下降幂互相转化即可。

  1. 第二类斯特林数展开:

\[{n+1\brace m+1}=\sum_k{n\choose k}{k\brace m} \]

证明:考虑组合意义。即枚举有哪些元素放在最后一个集合。

  1. 第一类斯特林数展开:

\[{n+1\brack m+1}=\sum_k{n\brack k}{k\choose m} \]

证明:设最后一个元素所在轮换大小为 \(t+1\),有方案数为 \(t!{n-t\brack m}\),这又对应 \({n\brack0},{n\brack1},\dots,{n\brack n}\) 中所有置换里不连接 \(t\) 个点与 \(n-t\) 个点的置换。

posted @ 2025-01-23 21:15  Lyrella  阅读(129)  评论(3)    收藏  举报