组合数学学习笔记

计数原理、排列、组合、递推关系、等差数列求和公式、自然数平方和公式、二项式定理。

计数原理

加法原理

做一件事有 种途径,每种途径有 个不同的方案,则做这件事的方案数为

乘法原理

做一件事有 个步骤,每个步骤有 个不同的方案,则做这件事的方案数为

容斥原理

统计多个集合的并的元素数量:先加上所有集合的元素的元素数量,再减去『多加的』每两个集合相交的元素数量,再加上『多减的』每三个集合相交的元素数量 ……

即等式左边是多个集合的并的元素数量,等式右边每一项是几个几何的交的元素数量,每一项的符号取决于元素数量的奇偶。

排列

全排列

个元素按照不同顺序排列,设总方案数为 (定义 ),考虑第一个元素摆放的位置,得出公式

普通排列

个元素中取 个,按照不同顺序排列,设总方案数为 ,每次选一个数,第一次有 种选择,第二次有 种选择,直到第 次有 种选择,即

将上式与 对比,缺少 及之后的项,即

有重复元素的全排列

种元素,第 种有 个,设 ,为了保证答案不重复,可以先求出 ,再除去每种元素重复的情况,即

组合

组合数

从 n 个元素中选择 k 个,顺序无关,设总方案数为 。把排列数 看做先从 n 各种选择 k 个元素,再对 k 个元素做全排列,即

移项得

组合数的性质

全选或全不选只有一种方案。

选择 个拿走相当于选择 个留下。

考虑最后一个选还是不选(Pascal 公式,常用来递推计算组合数表)。

可重复选择的组合

从 n 种无限多的元素中选择 k 个,共有 种方案。

组合数的计算

组合数表

用 Pascal 公式递推,组合数太大要开高精度或者取模。

BigInt combo[MAXN + 1][MAXN + 1];

inline void makeComboTable() {
    for (int i = 1; i <= MAXN; i++) {
        combo[i][0] = combo[i][i] = 1;
        for (int j = 1; j < i; j++){
            combo[i][j] = combo[i - 1][j] + combo[i - 1][j - 1];
        }
    }
}

inline BigInt &C(int n, int k) {
    return combo[n][k];
}
单个计算

书上有用 double 来算的,因为中间乘法 long long 可能会溢出,不知道那样会不会损失精度。

long long C(long long n, long long k) {
    long long result = 1;
    for (int i = 1; i <= k; i++) {
        result = result * (n - i + 1) / i;
    }
    return result;
}

递推关系

Fibonacci 数列

楼梯上共有 个台阶,一次可以走一个或两个,总方案数为

边界为

Catalan 数

给定一个凸 边形,用 条不相交的直线将它剖分成 个三角形,设方案总数为

对每个顶点编号,第 个顶点编号为 。作三角形 ),该三角形左边是一个 边形,右边是一个 边形,即

公式

等差数列

设数列 对于任意的 满足 ,则有

求和公式为

自然数平方和

不会证。

二项式定理