组合数学
- 组合数学
- 写在前面
- 计数原理
- 组合问题分类
- 排列
- 组合
- Lucas 定理
- 组合数学的一些思想方法
- 几个问题
- 组合数及其相关性质
- $C_{n+m}^{n} = C_{n+m}^m$
- $C_{n}^{m} = C_{n - 1}^{m - 1} + C_{n - 1}^{m}$
- $C_{n+r+1}^{r} = C_{n+r}^{r} + C_{n + r-1}^{r-1} + ... + C_{n}^{0}$
- $C_{n}{l}C_{l}{r} = C_{n}{r}C_{n-r}{l-r}$
- $C_{n}^{0} + C_{n}^{1} + ... + C_{n}^{n} = 2^n$
- $C_{n}^{0} - C_{n}^{1} + C_{n}^{2} - ... = 0$
- $C_{r}^{r} + C_{r+1}^{r} + ... + C_{n}^{r} = C_{n + 1}^{r + 1}$
- 二项式定理
写在前面
题做不动了,来写点笔记
计数原理
抽屉原理
把 (n + 1) 件物品放入 (n) 个抽屉里,至少有一个抽屉放了 (2) 个物品
这不是很显然?
容斥原理
在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。——百度百科
类似于去交集并集之类的。功能很明确,计数时没有重复没有遗漏,结合实际问题可能要复杂些,脑子不够用
组合问题分类
具体分为四种:
- 存在性问题:判断满足某种条件的情况或状态是否存在
- 计数性问题:存在多少种满足某种条件的情况或状态
- 构造性问题:如果以判断出满足某种条件的状态是存在的,那么如何构造出来
- 最优化问题:找出某种评价标准下的最佳(或较佳)构造方案
排列
(n) 个物品中选 (k) 个物品的方案数,(先后顺序不同为两种方案)
圆排列
(n) 个物品中选 (k) 个不分首尾的围成一个圆圈
方案数为:
组合
(n) 个物品中选 (k) 个,(先后顺序不同为一种方案)
定义式:
或者
Lucas 定理
就是一个公式:
也可以写作:
其中 (Lucas(n, 0) = 1) ,利用这个在递归的时候返回即可
一般应用于 (n) 和 (m) 很大的时候,可以大大简化运算,但要注意 (p) 必须是质数
如果模数不是很大,可以预处理出 (1 sim mod - 1) 的阶乘和逆元进行优化
组合数学的一些思想方法
插板法
一个典型的例子
把 (n) 个小球放进 (k) 个箱子里,求有多少种放法
- 空隙间必须有值的情况(每个箱子里至少有一个球):
考虑将 (n) 个小球排成一列,每两个小球间会有一个空隙,一共有 (n - 1) 个空隙。把箱子看成板子,插入空隙里,显然只要插 (k - 1) 个板子就能把小球分成 (n) 份,所以答案为
- 空隙间可以为空的情况(箱子里可以不放球):
与上面不同的是,两个板子可以同时插在一个地方,所以相当于多了 (k) 个可以插的地方,所以答案为:
几个问题
Question 1
有 (n) 个不同元素,选 (r) 个,可重复选,求方案数
求证: (ans = C_{n + r - 1}^{r})
思路:
设当 (n) 个元素中选 (r) 个不重复的元素时
那么当从 (n) 个元素中选 (r) 个可重复的元素时
设 (y_i = x_i + i - 1)
那么上式可表示为
发现与第一个不等式形式相同,所以答案类似是 (C_{n + r - 1}^{r})
因为对于每个 (x_i) 都有唯一的 (y_i) 与之对应,所以问题的答案也为 (C_{n + r - 1}^{r})
证毕。
Question 2
有 (n) 个元素,从中选 (r) 个不相邻的元素,求方案数
求证: (ans = C_{n - r + 1}^{r})
思路同 Question 1, 把 (y_i = x_i + i - 1) 改为 (y_i = x_i - i + 1),用相同的思路去推导即可
Question 3
求
[sum_{k=1}^{n}(C_{n}^{k})^2 ]
解:
然后就做完了。
这样做的意义是啥?
这就是在前 (n) 个元素中选 (k) 个,在后 (n) 个元素中选 (n - k) 个(选 (k) 个和选 (n -k) 个是一个意思)的方案数
为什么 (C_{2n}^{2k}) 不对?
因为这样你无法确定在前 (n) 个元素中选择了几个,在后 (n) 个元素中选择了几个
组合数及其相关性质
(C_{n+m}^{n} = C_{n+m}^m)
实际意义:从 (n+m) 个元素中选 (n) 个元素的方案数与选 (m) 个元素 剩下 (n) 个元素的方案数相同
(C_{n}^{m} = C_{n - 1}^{m - 1} + C_{n - 1}^{m})
暴力推导:
对左式进行通分合并就可以得到右式了
过程也很简单,在这里就不赘述了
实际意义:从 (n) 个里面选 (m) 个,对于最后一个元素,我们考虑两种情况:选或不选。如果选,那么还要在剩下的 (n - 1) 个元素中选择 (m - 1) 个元素;如果不选,那么还要在剩下的 (n - 1) 个元素中选择 (m) 个元素。
两种情况是并列的,因此把两种情况的方案数加起来即可。
其实这个式子还有另外一个名字:组合数的递推式。
也就是你可以从 (C_{1}^{1}) 采用递推的方式推到 (C_{n}^{m})
如果你把整个递推出来的三角形列出来的话,会发现这是一个杨辉三角
各位有兴趣的话可以稍微在打草纸上一划,就很容易看出
(C_{n+r+1}^{r} = C_{n+r}^{r} + C_{n + r-1}^{r-1} + ... + C_{n}^{0})
这个式子其实可以从上面那个式子进行更进一步的推导推出来
即来考虑更多的元素是否选择的情况
(C_{n}^{l}C_{l}^{r} = C_{n}^{r}C_{n-r}^{l-r})
实际意义:在 (n) 个元素中先选 (l) 个元素,再在这 (l) 个元素中选 (r) 个元素的方案 等于 在 (n) 个元素中先选 (r) 个元素,再在剩下的 (n - r) 个元素中选择 (l - r) 个元素的方案。因为两次操作是递进的(或者说有先后的),所以计算的时候是相乘的形式,也就是上面的捏个等式
(C_{n}^{0} + C_{n}^{1} + ... + C_{n}^{n} = 2^n)
含义: (n) 个元素,从中选任意个元素的方案数。
考虑对每个元素选或不选,对于每个元素都有两条路可走,所以 (n) 个元素随便选或不选的方案数为 (2^n)
另一个含义:把 (n) 个元素看做一个长度为 (n) 的 01 串,那么这个串中的 (1) 的个数对应着每种方案(或是 (0) 的个数),又因为这个 01 串能表示的数有 (0 o 2^n - 1) 共 (2^n) 个数,所以上式的方案数为 (2^n).
(C_{n}^{0} - C_{n}^{1} + C_{n}^{2} - ... = 0)
一种理解方式:上面的式子可以看做从 (n) 个元素中选 偶数 个和选 奇数 个的方案是一样的。考虑一个新加的东西选或不选,如果选的话,肯定会由原来的 奇数个 变成 偶数个 (或者 偶数个 变成 奇数个);如果不选的话,就不发生改变。因为两种情况是等概率出现的,因此从 (n) 个元素中选 奇数个 和选 偶数个 的方案数相同
(C_{r}^{r} + C_{r+1}^{r} + ... + C_{n}^{r} = C_{n + 1}^{r + 1})
好像和上面某个式子的推导思想一样来
二项式定理
[(x+y)^n = sum_{i = 0}^{n}C_{n}^{i} x^i y^{n-i} = sum_{i = 0}^{n}C_{n}^{i} x^{n-i} y^i ]