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