跳转至

排列组合

前置知识

小学数学

目标

普及组初赛阶段,排列组合方面,最少必要知识

排列数

img

组合数

img

img

img

组合数公式

img

img

img

img

img

组合数代码

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int n, m;

ll C(int n, int m){
    ll sum = 1ll;
    for (int i = 1; i <= m; i++)
        sum = sum * (n - m + i) / i;

    return sum;
}

int main(){
    cin >> n >> m;
    cout << C(n, m) << '\n';

    return 0;
}
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 110;

int n, m;
ll C[N][N];

int main(){
    cin >> n >> m;

    C[0][0] = 1;
    for (int i = 1; i <= n; i++){
        C[i][0] = C[i][i] = 1;
        for (int j = 1; j <= n; j++) C[i][j] = C[i - 1][j] + C[i - 1][j - 1];
    }

    cout << C[n][m] << '\n';

    return 0;
}

常见计数方法

特殊优先

img

捆绑与插空

img

img

img

img

img

插板法原理及应用

img

img

img

img

img

img

抽屉原理

又称,鸽巢原理。将 n + 1 个物体,划分成 n 组,那么有至少一组有两个(或以上)的物体。用反证法证明。

错位排列

img

img

容斥原理

img

img

Catalan数

img

img

img

img

说明: 一棵二叉树,根结点占 1 个结点,假设左子树 x 个结点,那么右子树有 n - 1 - x 个结点。 枚举 x for 0 ... n-1,即可得到上面的式子。

img

img

img

img

img

杨辉三角

img

总结

排列数,组合数,计算公式,公式变形,计算组合数的代码 特殊优先,捆绑插空,插板法 抽屉原理,错位排列,要会证明 容斥原理,会经典计算 Catanlan数,常见公式背下来 杨辉三角

参考

排列组合 - OI Wiki 插板法原理及应用_公考楚香凝_新浪博客 彻底搞懂错排公式_错排个数_bengshakalakaka的博客-CSDN博客 容斥原理 - OI Wiki 卡特兰数(Catalan)公式、证明、代码、典例. 杨辉三角(非常厉害的网站)