组合数学与计数(瞎写)
组合数学与计数
笔记,不含练习。
基本计数原理#
加法原理
乘法原理
组合数#
类似的,
一些性质#
对称恒等式
吸收提取不等式
与下降幂结合
加法归纳恒等式
二项式定理
下降幂转组合数
三项式版恒等式
范德蒙德卷积
插板法#
现有
个完全相同的元素,要求将其分为 组,保证每组至少有一个元素,一共有多少种分法?
考虑拿
因为元素是完全相同的,所以答案就是
本质是求
允许每组为空?
考虑加入
答案即为
本质是求
如果再扩展一步,要求对于第
组,至少要分到 , 个元素呢?
考虑先把下界补满,然后问题就转换为允许每组为空的了。
答案即为
二项式求导#
计算
考虑
由二项式定理得:
两边同时求导:
两边同乘
两边同时求导:
将
组合数取模#
卢卡斯定理:
例题#
个不同元素,选 个,每个可以选择多次(类似多重背包)。求方案数。
这个问题等价于
个不同元素,选 个,选的元素不能相邻。
考虑空格的分配。
因为要选
问题转化为
套用上面的公式,答案即为
求
。
考虑
就相当于把
显然等于
将
拆分为 个不同的组合数之和,求一组合法方案。
比较
和 的大小, 。
预处理阶乘的
错排#
设
如果
如果
如果
考虑加入第
对于每个
- 放在
号位置。这样剩下的 个元素错排即可。 - 不放在
号位置。因为 不能放在 ,而且因为原先的 位置被占用,就相当于没有,那么 号位置就相当于 号位置。这样 个元素错排即可。
综上,
斯特林数#
第二类#
转移#
考虑加入一个元素。
如果这个元素放在一个独立的集合内,有一种方案,剩下的部分有
如果放在一个已有的集合内,有
所以:
第一类#
一个轮换就是一个首尾相接的环形排列。
我们可以写出一个轮换
,并且我们认为 ,即,两个可以通过旋转而互相得到的轮换是等价的。 注意,我们不认为两个可以通过翻转而相互得到的轮换等价,即
。
转移#
考虑加入一个元素。
如果这个元素放在一个独立的轮换内,有一种方案,剩下的部分有
如果放在一个已有的集合内,有
所以:
通常幂和下降幂的转换#
下降幂转通常幂:
通常幂转下降幂:
容斥#
通过集合交的大小,求出集合并的大小。
设
错排#
这里有
显然,错排方案数=全排列-有至少一个在正确的位置上的的方案数。
考虑如何求出有至少一个在正确的位置上的方案数。
考虑容斥。满足任意
综上,错排方案数为:
但是这个式子就算预处理逆元都是
卡特兰数#
介绍#
以下问题属于Catalan数列:
- 有
个人排成一行进入剧场。入场费 元。其中只有 个人有一张 元钞票,另外 人只有 元钞票,剧院无其它钞票,问有多少种方法使得只要有 元的人买票,售票处就有 元的钞票找零? - 一位大城市的律师在她住所以北
个街区和以东 个街区处工作。每天她走 个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路? - 在圆上选择
个点,将这些点成对连接起来使得所得到的 条线段不相交的方法数? - 对角线不相交的情况下,将一个凸多边形区域分成三角形区域的方法数?
- 一个栈(无穷大)的进栈序列为
有多少个不同的出栈序列? 个结点可构造多少个不同的二叉树? 个 和 个 构成 项 ,其部分和满足 ( )。对于 ,该数列为?
其对应的序列为:
这就是卡特兰数列。
计算#
卡特兰数的递推式为:
其中
其他常见的公式有:
非降路径计数#
非降路径是指只能向上或向右走的路径。
- 从
到 的非降路径数等于 个 和 个 的排列数,即 。 - 从
到 的除端点外不接触直线 的非降路径数:
先考虑 下方的路径,都是从 出发,经过 及 到 ,可以看做是 到 不接触 的非降路径数。
所有的的非降路径有 条。对于这里面任意一条接触了 的路径,可以把它最后离开这条线的点到 之间的部分关于 对称变换,就得到从 到 的一条非降路径。反之也成立。从而 下方的非降路径数是 。根据对称性可知所求答案为 。 - 从
到 的除端点外不穿过直线 的非降路径数:
用类似的方法可以得到: 。
如果要求只能在直线的下方和直线上走,则方案数是 ,即卡特兰数。
问题#
有一个函数
容易发现,
板子#
下降幂
int dpow(int a,int b){
int ans=1;
for(int i=0;i<b;i++)ans=ans*(a-i)%mod;
return ans;
}
快速幂
int ksm(int a,int b){
int ans=1;
for(;b;b>>=1){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
逆元
int inv(int a){
int ans=1;
for(int i=mod-2;i;i>>=1){
if(i&1)ans=ans*a%mod;
a=a*a%mod;
}
return ans;
}
组合数
int C(int a,int b){
return fact[a]*inv(fact[b])%mod*inv(fact[a-b])%mod;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)