一只蒟蒻的组合数学的入门笔记
加法及乘法原理
加法原理
完成一件事有 $n$ 类方法,每类方法有 $m$ 个不同的方法,那么完成这件事总共就有 $N=m_{1}+m_{2}+…+m_{n}$ 种方法。
乘法原理
完成一件事有 $n$ 个步骤,每个步骤有 $m$ 个不同的方法,那么完成这件事总共就有 $N=m_{1} \times m_{2} \times … \times m_{n}$ 种方法。
排列与组合入门
排列与排列数
在 $n$ 个元素中任取 $m$ ($m<=n$,$m,n \in N$)个元素,按照一定顺序排列,所有的情况的个数叫做 从 $n$ 个不同元素中取出 $m$ 个的排列数。
公式如下:
$ A^{m}_{n}=\left ( n-m+1 \right )…\left ( n-2 \right )\left ( n-1 \right )n=\frac{n!}{\left (n-m\right )!} $
如何理解这个公式:
有 $m$ 个位置,第一个有 $n$ 种选法,第二个有 $n-1$ 种,以此类推,第 $m$ 种有 1 种选法,所以由乘法原理可得总方案数为 $\left ( n-m+1 \right )…\left ( n-2 \right )\left ( n-1 \right )n$。
组合与组合数
在 $n$ 个元素中任取 $m$ ($m<=n$,$m,n \in N$)个元素,组成一个组合(集合),所有的情况的个数叫做 从 $n$ 个不同元素中取出 $m$ 个的组合数。
公式如下:
$C^{m}_{n}=\frac{A^{m}_{n}}{m!}=\frac{n!}{m!\left (n-m\right)!}$
如何理解这个公式:
一个 $m$ 个元素的序列的全排列的序列数为 $m!$,所以将排列数除去全排列的序列数就为组合数。
$C^{m}_{n}$ 还写成 $\begin{pmatrix}n \\m\end{pmatrix}$,组合数也叫二项式系数。
特别地,当 $m>n$ 时,$A^{m}_{n}=C^{m}_{n}=0$。
C++ 求组合数代码
递归:
1 | const int N = 100005, MOD = 19260817; |
递推:
组合数满足以下递推式:
$\left\{\begin{matrix} C^{m}_{n}=C^{m-1}_{n}+C^{m-1}_{n-1},n>m>0\\C^{m}_{n}=1,m=0 或 n=m\end{matrix}\right.$
所以代码很容易打出来了。
1 | const int N = 1005, MOD = 19260817; |
求排列数则只要
将组合数乘上 $m!$ 就好了。
二项式定理
公式如下:
$\left ( a+b \right )^{n}= {\textstyle \sum_{n}^{i=0}\begin{pmatrix}n \\i\end{pmatrix}a^{n-i}b^{i}}$
其实很好理解,自己手推一下就出来了。
Catalan(卡特兰)数列
没什么好说的,记个公式(要推导它的通项公式需要生成函数,反正本蒟蒻不会)。
$Cat_{0}=Cat_{1}=1$
$Cat_{n}=\frac{\begin{pmatrix}2n\\n\end{pmatrix}}{n+1}\left ( n\ge 2,n \in N^{+}\right )$
其他 Catalan 数列常用公式:
$Cat_{n}=\frac{Cat_{n-1}\left ( 4n-2 \right )}{n+1}$
$Cat_{n}=\begin{pmatrix} 2n\\n\end{pmatrix}-\begin{pmatrix} 2n\\n-1\end{pmatrix}$
$Cat_{n}=\left\{\begin{matrix}{\textstyle \sum_{i=1}^{n}Cat_{i-1}Cat_{n-i}},n\ge 2,n\in N^{+} \\1, n=0,1\end{matrix}\right.$
代码可以由 $Cat_{n}=\frac{Cat_{n-1}\left ( 4n-2 \right )}{n+1}$ 很简单的写出来,这里就不放了。
应用
- 对角线不相交,将一个凸多边形分成多个三角形的方案数。
- 一个序列的进栈顺序为 $1,2,3…,n-1,n$,求有几种不同的出栈序列。
- $n$ 个节点可以构成多少个不同的二叉树。
- 等等等等
ok,有错误请 D 我。