数学还是太菜了 \kk 。
组合数和排列数
定义
高中数学选修三内容。
定义排列数 Amn 为从 n 个不重复的元素中选 m 个按一定顺序排列的方案数。
根据乘法原理易得
Amn=n×(n−1)×…×(n−m+1)=n!(n−m)!
定义排列数 Cmn 为从 n 个不重复的元素中选 m 个的方案数。
由排列数公式易得
Cmn=(nm)=n!m!(n−m)!
也就输排列数除去 n! ,简单易懂。
推广
(x+y)n=n∑i=0(ni)xiyn−i
若
g(i)=n∑i=k(ni)f(i)
则
f(i)=n∑i=k(ni)(−1)i−kg(i)
常用于解决一类形如 "恰好……" 的问题。这类问题中,一般将其转化为 "钦定……" 的问题便于求解,最后使用二项式反演即可。
例题:P4859,P6478
(一)
(ni)=n−i+1i(ni−1)
证明:显然。
(二)
(ni)=ni(n−1i−1)
证明:显然。
(三) 基本求和公式
n∑i=0(ni)=2n
证明:由组合意义易证。
(四) 交错和
n∑i=0(−1)i(ni)=0
证明:套用二项式定理即可。
(五)
n∑i=0||1k(ni)=n2n−1
证明:
n∑i=1k(ni)=n∑i=1in!i!(n−i)!=nn−1∑i=0(n−1)!i!(n−(i+1))!=nn−1∑i=0(n−1)!i!(n−1−i))!=nn−1∑i=0(n−1i)=n2n−1
总结
在大多数情况下,组合数学最常用的方面是计数问题,或直接根据题面公式计算。
在进行推导时,需灵活使用上述组合恒等式和定理进行代换和化简,必要时,也可以直接通过组合意义抽象出具体问题,需要大量的做题经验。
卡特兰数
卡特兰数是组合数学中的一种常见数列,前几项如下:
1,1,2,5,14,42,132,429,1430,4862,……
公式
从最经典的进出栈问题开始理解,通常大多数卡特兰数问题可以转化为这个。
由简单容斥可得,合法出栈序列 = 总序列个数 - 非法序列个数。
进栈抽象为 + 1 ,出栈抽象为 - 1 。
则序列总个数为 Cn2n 。
非法序列个数比较麻烦,需要转化一下。
找到每个非法序列第一个前缀和小于 0 的地方,将这之前的序列全部反转,容易证明这和原序列一一对应。
那么非法序列总个数即为 Cn+12n 。
合法序列总个数即为: (Cn 即为卡特兰数的第 n 项)
Cn=Cn2n−Cn−1xn=Cn2n(n+1)
由组合恒等变换得到递推公式:
Cn=Cn−14n−2n+1
顺便给一下最基础的通式吧:
Cn=⎧⎪⎨⎪⎩1n=0,1n−1∑i=0CiCn−i−1n≥2
组合意义/应用
- n 个元素入栈序列为 1 至 n ,出栈序列的总个数。
- n 对括号所能组合成的合法括号序列的个数。
- n+1 个节点所能构成的形状不同的满二叉树的总个数。
- n 个节点的形状不同的二叉树的总个数。
- ……
斯特林数
前置知识
上升幂:
x¯¯¯n=x(x+1)(x+2)…(x+n−1)
下降幂:
xn––=x(x−1)(x−2)…(x−n+1)
第一类斯特林数
把 1 到 n 排列成 k 个非空循环(或者叫做圆排列?)的方案数,写作 s(n,k) 或 [nk] 。
加入 n 即可看作自身构成循环或加入到前 n 个数前,易得递推公式:
[nk]=[n−1k−1]+(n−1)[n−1k]
-
s(0,0)=1
-
s(n,0)=0
-
s(n,1)=(n−1)!
-
s(n,n−1)=C2n
第二类斯特林数
比第一类斯特林数更为常用。
把 1 到 n 分成 k 个集合的方案数,写作 S(n,k) 或 {nk} 。
和第一类斯特林数类似的:
{nk}={n−1k−1}+k{n−1k}
- S(0,0)=S(n,1)=1
- S(n,0)=S(n,0)=0
- S(n,2)=2n−1−1
斯特林数和上升/下降幂的应用
原本是打算自己找资料的,但看到几篇博文写的实在太好,就摆了。
https://www.luogu.com.cn/blog/wangrx/finite-calculus
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】