组合数学
抽屉原理
将n+1个物体划分为n组,至少有一组有两个及以上的物体
将n个物体划分为k组,至少存在一个分组,含有大于等于
个物体
插板法
n个完全相同的元素分为k组,每组至少一个元素,一共有多少分发
我们通过插板子来实现分组,用k-1块板子插入n-1个空中,即有
若每组允许为空,我们将条件转化为在n+k个元素形成的n+k-1个空里面插板子,即有
容斥原理
前置知识:德摩根律
简单形式:设A,B是分别具有性质
推广:设集合S的子集
集合S至少具有性质
之一的元素个数为$ _{i=1}^{n} |A_i|=|A_i|-|A_iA_j|+|A_iA_jA_k|-+(-1)n|_{i=1}{n}A_i| $ 集合S不具有性质
之一的元素个数为$ _{i=1}^{n} ||=|S|-(|A_i|-|A_iA_j|+|A_iA_jA_k|-+(-1)n|_{i=1}{n}A_i| )$
求组合数
求解
(其中p为质数)
阶乘+乘法逆元
- 求出阶乘n!,m!,(n-m)!,每次乘法后取模
- 求出阶乘对应的乘法逆元
这里我们可以预处理掉对应阶乘与对应逆元,在计算组合数时直接计算
1 | ll fac[N], infac[N]; |
别忘了调用init_fac()进行初始化!!!
卢卡斯定理
其中前半部分可以用卢卡斯定理递归求解,后半部分用上方方法求解
卢卡斯定理可以优化求解速度,而且适用于求解a,b较大而p较小的情况
1 | ll lucas(ll n, ll m){ |
多重全排列
由