Preface
组合数学真是有趣
排列数
单看一个元素, 他可以排在任意 n 个位置上
第二个元素: 排在除第一个之外的 n−1 个位置
如此这般
Ann=n!
任取 k 个元素: 那就是减去其余 n−k 个元素的全排列
在此, 我们算出全部的排列, 除去蓝色的重复的情况, 剩下的就是红色的了
■■■■■
Ank=(n−k)!n!
组合数
同理
■■■■■
我们把蓝色减掉之后还不够, 红色部分重复了, 那就再把红色部分除一下, 把多余的合并为一个即可
(kn)=k!(n−k)!n!
常见计数方法
特殊优先处理
中间指蓝色, 排头排尾为红色
■■■■■
在特殊条件加持下, 优先处理这一块就好:
-
在前面放一个钩子, 最后处理特殊条件
Source⇒Common⇒Special
e.g. 5个人排列, AB相邻
- 首先将 AB 转化为一个人
- 然后 计算 4 个人的排列数 A44=4!=24
- 再处理 AB 的情况, Ans=A44⋅2=48
-
直接优先处理特殊条件, 然后再去处理 一般情况
e.g. 5个人排列, A不在排头, B不在排尾
分类讨论 A
- 放在 中间 3 个位置 ⇒ B: 3种
- 放在 排尾 ⇒ B: 4种
其余任意排
综合: (3⋅3+1⋅4)⋅A33=13⋅A33=78
容斥原理
简单来说就是先什么都不管地 +/− 然后再去处理重复或者缺少的情况, 最终处理到所有集合的交集
i=1⋃nSi=i∑∣Si∣−i<j∑∣Si∩Sj∣+i<j<k∑∣Si∩Sj∩Sk∣−⋯+(−1)m−1ai<ai+1∑i=1⋂mSai+⋯+(−1)n−1∣S1∩⋯∩Sn∣
e.g. 5个人排列, A不在排头, B不在排尾, AB不相邻
- AB分别在 排头排尾: A33
- A在排头: 4⋅A33
- B在排尾: 4⋅A33
综合: A55−2⋅4⋅A33+A33=13⋅A33=78
- AB相邻: 3种情况(AB在中间+A在排尾+B在排头)
AB在中间: 2⋅A22
综合: A55−2⋅4⋅A33+A33−2⋅A22−2=72
Catalan
浅谈 Catalan 数
错位排列
定义
对于 n 个元素, 其中 ai 不在 第 i 位(原位)
解法
考虑容斥原理, 设 Si 为 i 在原位的情况
Dn=n!−∣∪i=1nSi∣
首先是 ∑∣Si∣ 随便挑一个数固定, 剩下数任意排, ∑∣Si∣=(1n)⋅(n−1)!
然后是 ∑∣Si∩Sj∣ 显然, ∑∣Si∩Sj∣=(2n)⋅(n−2)!
最后是 ∑∣Si1∩⋯∩Sik∣=(kn)⋅(n−k)!=k!n!
那么原式就是
Dn=n!−∑∣Si∣+∑∣Si∩Sj∣−⋯+(−1)n∑∣Si1∩⋯∩Sin∣=n!−n!+⋯+(−1)nn!n!=n!⋅(1−1!1+2!1−⋯+3!1+⋯+(−1)nn!1)
第二类 Stirling 数
定义
S(n,k) 表示将 n 个元素划分为 k 个无序(不可辨认)非空盒子里面的方法数
S(n,1)=S(n,n)=1,n≥1
考虑分治
首先考虑第 1 个元素
- 单独分入一个盒子: S(n−1,k−1)
- 否则与其他一起分入盒子(随机选择): k⋅S(n−1,k)
综合: S(n,k)=S(n−1,k−1)+k⋅S(n−1,k)
计数技巧
列方程
在有多重方法求得解(方程)时, 列出 k 个方程, 直至问题可解
e.g 一颗二叉树中 7 个节点有 2 个儿子, 求有多少叶子节点?
考虑二叉树的性质 Si 为 有 i 个儿子的节点数
那么可以列出以下方程:
- 从构成角度出发: S=S0+S1+S2
- 从贡献角度出发: S=1+S1+2⋅S2
解这两个方程得 S0=S2+1
扩展
{S=S0+S1+⋯+SkS=1+S1+2⋅S2+3⋅S3+⋯+k⋅Sk
S0=S2+2⋅S3+⋯+(k−1)⋅Sk+1