前言
本文主要记录一些组合数学中常用(?)的特殊数,背景是清华学长回校讲课。
斯特林数
斯特林数有两类,我们先从比较常见的第二类开始介绍。
第二类斯特林数
我们用 \(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!
\]
斯特林数的一些常用公式
这里面的公式通常和一些奇奇怪怪的组合数之类的搭配使用,其中普通幂与其他幂之间的转化最常见,但本文也许会不限于此。其中普通幂转下降幂会给出证明,而其他有关幂之间的转换证明可参考证明。
- 普通幂转下降幂:
\[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}
\]
- 上升幂转普通幂:
\[x^\overline n=\sum_{k=0}^n{n\brack k}x^k
\]
- 下降幂转普通幂:
\[x^\underline n=\sum_{k=0}^n(-1)^{n-k}{n\brack k}x^k
\]
证明考虑两边带入 \(-x\) 然后变成上升幂证。
- 普通幂转上升幂:
\[x^n=\sum_{k=0}^n(-1)^{n-k}{n\brace k}x^\overline k
\]
- 反转公式:
\[\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]
\]
证明用普通幂先转上升幂再用上升幂转普通幂,下面的就用普通幂和下降幂互相转化即可。
- 第二类斯特林数展开:
\[{n+1\brace m+1}=\sum_k{n\choose k}{k\brace m}
\]
证明:考虑组合意义。即枚举有哪些元素放在最后一个集合。
- 第一类斯特林数展开:
\[{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\) 个点的置换。