组合数学
排列组合
排列组合是组合数学的基础,排列就是取出部分数字进行排序,组合就是不考虑顺序。
排列组合的中心问题是研究给定要求的排列和组合可能出现的情况总数。
加法、乘法原理
加法原理:一个东西有
乘法原理:一个东西有
排列数与组合数
排列数,代表的是从
排列数的公式:
组合数也差不多,但是不考虑顺序。
组合数的公式:
tips:组合数也被称为「二项式系数」。
组合数求解-帕斯卡公式
组合数求解-预处理逆元
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 10, mod = 1e9 + 7; int n, inv[N], X[N], F[N]; inline int C (int a, int b) { return (a >= b ? 1ll * F[a] * X[b] % mod * X[a - b] % mod : 0); } inline int A (int a, int b) { return (a >= b ? 1ll * F[a] * X[a - b] % mod : 0); } int main () { ios::sync_with_stdio(0), cin.tie(0); inv[1] = X[0] = F[0] = 1; for (int i = 2; i <= n; i++) inv[i] = 1ll * (mod - mod / i) * inv[mod % i] % mod; for (int i = 1; i <= n; i++) X[i] = 1ll * X[i - 1] * inv[i] % mod, F[i] = 1ll * F[i - 1] * i % mod; return 0; }
二项式定理
卢卡斯定理
卢卡斯定理可以求大数的
对于非负整数
递归实现即可。
int lucas (int n, int m) { return (!m ? 1 : 1ll * lucas(n / mod, m / mod) * C(n % mod, m % mod) % mod); }
多重集排列
有一个多重集,元素种类为
那么多重集的
多重集的
抽屉(鸽巢)原理
鸽巢(the pigeonhole principle)原理,通常用于求解一些比较极端的情况。
最基础:如果有
进阶:如果有
容斥原理
容斥原理的思想大致就是在求总量时,可以先不管重不重复,求出总和后再减去重复部分。
二元容斥:
三元容斥:
把它推广一下就是我们熟知的容斥原理了。
卡特兰数 Catalan
卡特兰数
- 长度为
的合法括号序列的个数。 - 在圆上选择
个点,将这些点成对连接起来使得所得到的 条线段不相交的方法数。 - ......
求解式:
。 。 。
本文作者:wnsyou の blog
本文链接:https://www.cnblogs.com/wnsyou-blog/p/combination_math.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步