组合数学

二项式反演

形式

形式 \(1\)

\[f(n)=\sum\limits_{i=0}^{n}(-1)^i\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum\limits_{i=0}^{n}(-1)^i\binom{n}{i}f(i) \]

形式 \(2\)

\[f(n)=\sum\limits_{i=0}^{n}\binom{n}{i}g(i)\Leftrightarrow g(n)=\sum\limits_{i=0}^{n}(-1)^{n-i}\binom{n}{i}f(i) \]

形式 \(3\)

\[f(n)=\sum\limits_{i=n}(-1)^i\binom{i}{n}g(i)\Leftrightarrow g(n)=\sum\limits_{i=n}(-1)^{i}\binom{i}{n}f(i) \]

形式 \(4\)

\[f(n)=\sum\limits_{i=n}\binom{i}{n}g(i)\Leftrightarrow g(n)=\sum\limits_{i=n}(-1)^{i-n}\binom{i}{n}f(i) \]

把右边的东西带到左边里面就能证了。

应用

可以解决关于“钦定”的问题?

斯特林数

oiwiki

有两类,分开说。

第二类斯特林数

虽然被称作「第二类」,第二类斯特林数却在斯特林的相关著作和具体数学中被首先描述,同时也比第一类斯特林数常用得多。

第二类斯特林数(斯特林子集数) \(\begin{Bmatrix}n\\ k\end{Bmatrix}\),表示将 \(N\)两两不同的元素,划分为 \(k\)相同非空子集的方案数。

递推式

\[\begin{Bmatrix}n\\m\end{Bmatrix} = \begin{Bmatrix}n-1\\m-1\end{Bmatrix} + m\begin{Bmatrix}n-1\\m\end{Bmatrix} \]

边界为:\(\begin{Bmatrix}n\\0\end{Bmatrix}=[n=0]\)

利用组合意义证明。考虑第 \(n\) 个球的放置:

  1. 在原有 \(m-1\) 个盒子的情况下开一个新盒子,把第 \(n\) 个球放进去,方案数为 \(\begin{Bmatrix}n-1\\m-1\end{Bmatrix}\)

  2. 在原有 \(m\) 个盒子的情况下,把第 \(n\) 个球放进其中一个盒子,方案数为 \(m\begin{Bmatrix}n-1\\m\end{Bmatrix}\)

根据加法原理,加一下就有了递推式。

通项公式

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\sum\limits_{i=0}^{m}\frac{(-1)^{m-i}i^n}{i!(m-i)!} \]

设有 \(n\) 个不同的球,放进 \(i\) 个不同的盒,

  • 允许空盒的方案数为 \(G_i\)
  • 不允许空盒的方案数为 \(F_i\)

显然有:

\[G_i=i^n\\G_i=\sum\limits_{j=0}^{i}\binom{i}{j}F_j \]

根据二项式反演,有:

\[\begin{aligned}F_i&=\sum\limits_{j=0}^{i}(-1)^{i-j}\binom{i}{j}G_j\\&=\sum\limits_{j=0}^{i}(-1)^{i-j}j^n\frac{i!}{j!(i-j)!}\end{aligned} \]

考虑 \(F_m\)\(\begin{Bmatrix}n\\m\end{Bmatrix}\) 的关系,第二类斯特林数要求盒子相同,所以显然有 \(F_m=m!\cdot \begin{Bmatrix}n\\m\end{Bmatrix}\),除掉 \(m!\) 以去掉标号。

于是:

\[\begin{Bmatrix}n\\m\end{Bmatrix}=\sum\limits_{i=0}^{m}\frac{(-1)^{m-i}i^n}{i!(m-i)!} \]

同一行的计算

P5395 第二类斯特林数·行

即为给定 \(n\),求:

\[\begin{Bmatrix}n\\0\end{Bmatrix},\begin{Bmatrix}n\\1\end{Bmatrix},\begin{Bmatrix}n\\2\end{Bmatrix},\dots,\begin{Bmatrix}n\\n\end{Bmatrix} \]

的值。

算两个数组:

\[f_i=\frac{i^n}{i!},g_i=\frac{(-1)^i}{i!} \]

\(f\)\(g\) 卷积就行了。

提交记录

同一列的计算

P5396 第二类斯特林数·列

给定 \(n,k\),求:

\[\begin{Bmatrix}0\\k\end{Bmatrix},\begin{Bmatrix}1\\k\end{Bmatrix},\begin{Bmatrix}2\\k\end{Bmatrix},\dots,\begin{Bmatrix}n\\k\end{Bmatrix} \]

的值。

回想例题 P5748 集合划分计数,这个例题其实就是同一行第二类斯特林数求和。我们考虑通过 EGF 求解本题。

只有一个盒子且必须放,我们构造数列 \(a=\langle0,1,1,1,\dots\rangle\),它的第 \(n\) 项表达将 \(n\) 个不同的球放进一个盒子里的方案数。

由于我们盒子必须放东西,所以 \(a_0=0\)

我们能求出 \(a\) 的 EGF:\(\hat F(x)=\sum\limits_{i\ge 1}\dfrac{x^i}{i!}=e^x-1\)

在那个题的学习中,我们知道了:

  1. \(\hat F(x)^k\) 表示不同的/有标号的球放进 \(k\)不同的/有标号的盒子的生成函数。
  2. \(\dfrac{\hat F(x)^k}{k!}\) 表示不同的/有标号的球放进 \(k\)相同的/无标号的盒子的生成函数。

于是乎,我们就有:

\[\begin{Bmatrix}i\\k\end{Bmatrix}=\left[\frac{x^i}{i!}\right]\frac{\hat F(x)^k}{k!} \]

其中 \(\left[\dfrac{x^i}{i!}\right]\) 的含义为 \(x^i\) 项的系数乘以 \(i!\)

于是我们多项式快速幂算出 \(\hat F(x)^k\) 即可。

注意,这里 \(\hat F(x)^k\) 的常数项为 \(0\),不能直接 \(\ln \exp\) 做,但一次项是 \(1\),所以我们可以提一个 \(x^k\) 出来,就能做了。

提交记录

oiwiki 上还说,\(e^{\hat F(x)}\),也就是同一行求和,就是贝尔数的生成函数。贝尔数是啥我都不知道。

性质

  1. \(m^n=\sum\limits_{i=0}^{m}\begin{Bmatrix}n\\i\end{Bmatrix}i!\dbinom{m}{i}\)

第一类斯特林数

第一类斯特林数(斯特林轮换数) \(\begin{bmatrix}n\\ k\end{bmatrix}\),表示将 \(n\)两两不同的元素,划分为 \(k\)相同非空轮换的方案数。

一个轮换就是一个首尾相接的环形排列。我们可以写出一个轮换 \([A,B,C,D]\),并且我们认为 \([A,B,C,D]=[B,C,D,A]=[C,D,A,B]=[D,A,B,C]\),即,两个可以通过旋转而互相得到的轮换是等价的。注意,我们不认为两个可以通过翻转而相互得到的轮换等价,即 \([A,B,C,D]\neq[D,C,B,A]\)

递推式

\[\begin{bmatrix}n\\m\end{bmatrix}=\begin{bmatrix}n-1\\m-1\end{bmatrix}+(n-1)\begin{bmatrix}n-1\\m\end{bmatrix} \]

边界为 \(\begin{bmatrix}n\\0\end{bmatrix}=[n=0]\)

利用组合意义证明。考虑第 \(n\) 个元素的放置:

  1. 在原有 \(m-1\) 个轮换的情况下开一个新轮换,把第 \(n\) 个元素放进去,方案数为 \(\begin{bmatrix}n-1\\m-1\end{bmatrix}\)

  2. 在原有 \(m\) 个轮换的情况下,把第 \(n\) 个球放进其中一个轮换,方案数为 \((n-1)\begin{bmatrix}n-1\\m\end{bmatrix}\)

根据加法原理,加一下就有了递推式。

通项公式

没有。

同一行的计算

P5408 第一类斯特林数·行

即为给定 \(n\),求:

\[\begin{bmatrix}n\\0\end{bmatrix},\begin{bmatrix}n\\1\end{bmatrix},\begin{bmatrix}n\\2\end{bmatrix},\dots,\begin{bmatrix}n\\n\end{bmatrix} \]

的值。

我们搞出来 OGF:

\[F_n(x)=\sum\limits_{i=0}^{n}\begin{bmatrix}n\\i\end{bmatrix}x^i \]

根据递推公式,有:

\[F_n(x)=(n-1)F_{n-1}(x)+xF_{n-1}(x) \]

于是有:

\[F_n(x)=\prod\limits_{i=0}^{n-1}(x+i)=x^{\overline{n}} \]

那么上升幂咋求?????

我们考虑分治。因为上升幂满足:

\[x^{\overline{2n}}=x^{\overline{n}}\cdot (x+n)^{\overline{n}} \]

假如说当前已经求出 \(f(x)\) 的各项系数,我们考虑如何计算 \(f(x+n)\) 的各项系数。这个搞明白了用上面式子随便写写就行了(注意考虑 \(n\) 为奇数时最后面还有一项 \((x+n-1)\))。

我们有(\(a\)\(f(x)\) 的各项系数):

\[f(x+n)=\sum\limits_{i=0}^{n}a_i(x+n)^i \]

二项式定理展开:

\[f(x+n)=\sum\limits_{i=0}^{n}a_i\sum\limits_{j=0}^{i}\binom{i}{j}n^{i-j}x^j \]

更换枚举顺序:

\[f(x+n)=\sum\limits_{j=0}^{n}x^j\sum\limits_{i=j}^{n}a_i\binom{i}{j}n^{i-j} \]

把二项式拆开:

\[f(x+n)=\sum\limits_{j=0}^{n}\frac{x^j}{j!}\sum\limits_{i=j}^{n}\frac{i!a_in^{i-j}}{(i-j)!} \]

我们令 \(A(x)=x!a_x\)\(B(x)=\dfrac{n^x}{x!}\),于是有:

\[f(x+n)=\sum\limits_{j=0}^{n}\frac{x^j}{j!}\sum\limits_{i=j}^{n}A(i)B(i-j) \]

枚举 \(i-j\)

\[f(x+n)=\sum\limits_{j=0}^{n}\frac{x^j}{j!}\sum\limits_{i=0}^{n-j}A(i+j)B(i) \]

此时我们考虑把 \(A\) 翻转,即 \(A'(n-x)=A(x)\),于是有:

\[f(x+n)=\sum\limits_{j=0}^{n}\frac{x^j}{j!}\sum\limits_{i=0}^{n-j}A'(n-j-i)B(i) \]

于是我们把 \(A'\)\(B\) 求个卷积,设 \(C=A'\times B\),原式就成了:

\[f(x+n)=\sum\limits_{j=0}^{n}\frac{C(n-j)}{j!}x^j \]

这样就得出了 \(f(x+n)\) 的各项系数了!

提交记录

同一列的计算

P5396 第二类斯特林数·列

给定 \(n,k\),求:

\[\begin{bmatrix}0\\k\end{bmatrix},\begin{bmatrix}1\\k\end{bmatrix},\begin{bmatrix}2\\k\end{bmatrix},\dots,\begin{bmatrix}n\\k\end{bmatrix} \]

的值。

我们用 EGF 搞搞。

首先考虑 \(i\) 个球放进 \(1\) 个轮换里的 EGF。

\(m\) 个球放进一个轮换里的方案是多少?可以先考虑 \(m\) 个球的排列数,显然为 \(m!\),而其中每 \(m\) 个排列在轮换意义下会等价,故方案数为 \(\dfrac{m!}{m}=(m-1)!\)

于是就可以写出来 EGF 了:

\[\hat F(x)=\sum\limits_{i=1}^{n}\frac{(i-1)!x^i}{i!}=\sum\limits_{i=1}^{n}\frac{x^i}{i} \]

思考一下后会有:

  1. \(\hat F(x)^k\) 表示不同的/有标号的球放进 \(k\)不同的/有标号的轮换的生成函数。
  2. \(\dfrac{\hat F(x)^k}{k!}\) 表示不同的/有标号的球放进 \(k\)相同的/无标号的轮换的生成函数。

于是乎,我们就有:

\[\begin{bmatrix}i\\k\end{bmatrix}=\left[\frac{x^i}{i!}\right]\frac{\hat F(x)^k}{k!} \]

把第二类斯特林数·列的代码改改就行了。

提交记录

卡特兰数

oiwiki

记作 \(H_n\)

常见公式

\[\begin{aligned}&H_n=\frac{\binom{2n}{n}}{n+1}(n\ge 2,n\in \mathbb{N}_+)\\&H_n=\begin{cases}\sum\limits_{i=1}^{n}H_{i-1}H_{n-i} & n\ge 2,n\in \mathbb{N}_+ \\ 1 & n=0,n=1\end{cases}\\&H_n=\frac{H_{n-1}(4n-2)}{n+1}\\&H_n=\dbinom{2n}{n}-\dbinom{2n}{n-1}\end{aligned} \]

递推式/封闭形式

\[H_n=\sum\limits_{i=0}^{n-1}H_iH_{n-1-i}(n\ge 2) \]

其中 \(H_0=1,H_1=1\)。记起 OGF 为 \(H(x)\)

构造个方程,去解它的封闭形式:

\[H(x)=1+xH(x)^2 \]

解出来:

\[H(x)=\frac{1\pm \sqrt{1 - 4x}}{2x} \]

经过讨论,舍掉正号:

\[H(x)=\frac{1- \sqrt{1 - 4x}}{2x} \]

然后我们运用牛顿二项式定理啊,双阶乘的化简技巧啊之类的东西展开它,得出:

\[H(x)=\sum\limits_{n\ge 0}\dbinom{2n}{n}\frac{1}{n+1}x^n \]

这样就解出了通项公式。

伯努利数

好的博客

可以用来求自然数幂和。

\[\begin{aligned}&B_0=1\\&B_k=1-\frac{1}{k+1}\sum\limits_{i=0}^{k-1}\binom{k+1}{i}B_i\\&\sum\limits_{j=0}^{m}\binom{m+1}{j}B_j=[m=0]\end{aligned} \]

我们有其 EGF:

\[\sum\limits_{n=0}\frac{B_nx^{n}}{n!}=\frac{x}{e^x-1} \]

可以用 EGF 预处理伯努利数。

有个神奇的定理:

\[\sum\limits_{i=0}^{n-1}i^k=\frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i}B_in^{k+1-i} \]

或者说:

\[\sum\limits_{i=0}^{n}i^k=n^k + \frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i}B_in^{k+1-i} \]

所以预处理伯努利数,就能 \(O(k)\) 求自然数幂和。

51nod 1258 序列求和 V4

这就是个例题。

提交记录

分拆数

oiwiki

经典例题:P4389 付公主的背包

\(p(n,k)\) 为把 \(n\) 拆分成 \(k\) 个正整数之和的方案数,有:

\[p(n,k) = p(n-1,k-1) + p(n-k,k) \]

或者用生成函数求。假如说可以分成的整数集合为 \(D\),有生成函数:

\[F(x)=\prod\limits_{k\in D}\sum\limits_{i=0} x^{ik}=\prod\limits_{k\in D}\frac{1}{1-x^k} \]

其第 \(n\) 项系数为把 \(n\) 拆分成 \(D\) 中的数的方案数。其求法:

\[\begin{aligned} F(x)&=\prod\limits_{k\in D}\frac{1}{1-x^k}\\ &=\exp \sum\limits_{k\in D}\ln \frac{1}{1-x^k}\\ &=\exp \sum\limits_{k\in D}\sum\limits_{i=1}\frac{x^{ik}}{i} \end{aligned}\]

后面可以通过拆贡献计算。推倒与计算过程在多项式习题-付公主的背包中有详细讲。

例题

P5824 十二重计数法

题解真的写的很详细了……我不写了……

提交记录

\[\begin{aligned}\\\\\\\\\\\\\\\\\end{aligned} \]

posted @ 2024-03-23 14:31  一匹大宝羊  阅读(15)  评论(0编辑  收藏  举报