组合数学:从入门到被入门
废话不多说,直接开始讲吧。
加法&乘法原理
略。
排列与组合基础
排列数
组合数就是从 \(n\) 个不同元素中选择 \(m\) 个元素组成列表的方案数,记作 \(A_n^m\) 。
计算排列数的公式为: \(\displaystyle A_n^m=\frac{n!}{(n-m)!}\) 。
直观理解一下,第一个数有 \(n\) 种选法,第二个数有 \(n-1\) 种选法,以此类推,第 \(m\) 个数有 \(n-m+1\) 种选法,所以总共的选法是:
组合数
组合数就是从 \(n\) 个不同元素中选择 \(m\) 个元素组成集合的方案数,记作 \(\displaystyle C_n^m=\binom nm\) 。
计算组合数的公式为:\(\displaystyle\binom nm=\frac{n!}{m!(n-m)!}\)
由于一个大小为 \(m\) 的集合对应 \(m!\) 个列表,所以 \(\displaystyle\binom nm=\frac{A_n^m}{m!}=\frac{n!}{m!(n-m)!}\) 。
本文内认为如果 \(m<0\) 或 \(m>n\) ,则令 \(\displaystyle\binom nm=0\) 。(建议读者在写的时候也判一下)
组合数有几个性质:
-
\(\displaystyle\binom nm=\binom n{n-m}\)(选 \(m\) 个元素组成集合相当于选 \(n-m\) 个元素组成这个集合的补集)
-
\(\displaystyle\binom nk=\frac nk\binom{n-1}{k-1}\)(定义式)
-
\(\displaystyle\binom nm=\binom{n-1}{m}+\binom{n-1}{m-1}\) (选 \(m\) 个元素组成集合,可以考虑选不选最后一个元素,于是可以得到一个递推式)
-
\(\displaystyle(a+b)^n=\sum_{i=0}^n\binom ni a^ib^{n-i}\)
上面这个式子就是所谓的二项式定理,其中容易用到的几种特殊情况如下:
- \(a=b=1:\displaystyle\sum_{i=0}^n\binom ni=2^n\)
- \(a=1,\ b=-1:\displaystyle\sum_{i=0}^n\binom ni(-1)^i=[n=0]\)
- \(b=1:\displaystyle\sum_{i=0}^n\binom nia^i=(a+1)^i\)
还有一个神奇的性质:
- \(\displaystyle\sum_{i=0}^m \binom ni\binom m{m-i}=\binom{m+n}m\ \ \ (n\geq m)\)
这个性质不是特别会证,但是有的时候拆组合数用得到。
- \(\displaystyle\sum_{i=0}^n \binom ni^2=\binom{2n}n\)(上式的特殊情况)
插板法
用于求解一些组合问题。
例:求将 \(n\) 个小球放在 \(k\) 个盒子里,小球相同,盒子不相同,不允许为空的方案数。(\(k\) 个正整数加起来 \(=n\) 的方案数)
由于这道题只考虑每个盒子里小球的数量,考虑把这 \(n\) 个小球排成一列,可以考虑在每两个小球中间选择性地插入一块板子,总共插 \(k-1\) 份,把小球分成 \(k\) 组。可以证明插板的方案数和原题方案数是相同的。
答案是 \(\displaystyle\binom {n-1}{k-1}\)。
例:求将 \(n\) 个小球放在 \(k\) 个盒子里,小球相同,盒子不相同,允许为空的方案数。(\(k\) 个自然数加起来 \(=n\) 的方案数)
先在 \(k\) 个盒子里各预留一个元素,也就是将原来的 \(n\) 个小球变为 \(n+k\) 个,然后就变成了不允许为空的方案数,插板法即可。
答案是 \(\displaystyle\binom {n+k-1}{n}\)。
例:求 \(k\) 个整数加起来 \(=n\) ,并且第 \(i\) 个数 \(\ge a_i\) 的方案数。
和上一道题基本一样,只需要把多的减掉,少的加上即可。
答案是 \(\displaystyle\binom {n-\sum a_i+k-1}{n-\sum a_i}\)。
容斥
基本公式
省流:
即
例题见OI Wiki。
建议推一下错排数练练手。
二项式反演
代数意义
当容斥时几个集合的交集(并集)大小只和集合数量有关,跟具体是哪几个集合无关时,就会有以下式子:
设 \(f(n)=|n\) 个集合的交集大小\(|\),\(g(n)=|n\) 个集合的并集大小\(|\),则有:
于是这就是二项式反演的形式之一了,我们把这种形式叫做“形式零”,因为这种形式通常不用。
形式一:
这也就是把左边的 \(-1\) 提到了右边,证明不难。
其实还有一个更通用的式子是这样的:
形式二:
组合意义
我们令 \(f(x)\) 代表钦定选 \(i\) 个的方案数, \(g(x)\)代表 恰好选 \(i\) 个的方案数。
(注:在 \(f(x)\) 中,每种方案可能被统计多次,它是让你先选择 \(i\) 个,计算出选了这 \(i\) 个的方案数,最终再求和)
则对于任意的 \(i\ge n\) ,\(g(i)\) 在 \(f(n)\) 里被算了 \(\binom in\) 次,故 \(\displaystyle f(n)=\sum_{i=n}^m\binom ing(i)\) ,采用形式二即可。
min-max 容斥
有一些求 \(\min\) 或 \(\max\) 的题可以用得到。
还是先把式子放上来:
这个式子主要在求期望的时候用处比较大:
于是就可以实现最大值问题和最小值问题之间的转化了。
实际上这个式子对于第 \(k\) 大(小)也是成立的:
以上式子也可以用来推 \(\operatorname{lcm}\) 和 \(\gcd\) ,只不过把求和换成了求积,系数 \(-1\) 变成了逆元。
一些经典的数列
斐波那契数列 & 卢卡斯数列
定义
斐波那契数列的定义如下:
卢卡斯数列的定义如下:
大家应该对斐波那契数列相对要熟悉一点,而分析斐波那契数列就要用到卢卡斯数列。
通项公式(解析解)
斐波那契数列的通项公式如下:
卢卡斯数列的定义如下:
这两个式子虽然在OI中不常见,但是当涉及取模意义下的二次剩余和逆元时就很有用了。
事实上,有 \(L_n^2-5F_n^2=-4\)。
通项公式(矩阵)
众所周知,有很多递推式能通过矩阵求解。
以斐波那契数列为例:
因此
如果你对矩阵运算不是很熟悉的话,建议写一下【模板】矩阵加速(数列)。
卢卡斯数列同理。
顺便说一句,关于斐波那契数列和组合数,有一个奇妙的性质:
错位排列
错排数是指 \(p_i\neq i\) 的排列 \(\{p_i\}\) 的方案数。
错排数可以用容斥原理求,建议手推一下。
结论是:
推导过程
设 \(S_i\) 是 \(p_i=i\) 的排列 \(\{p_i\}\) 所组成的集合,则我们要求 \(\displaystyle n!-\left|\bigcup_{i=1}^nS_i\right|\) 的值。
带入容斥式子,由于这里集合并的大小只和集合数有关,和具体元素无关(因为我们不关心哪几个元素,只关心有几个元素满足 \(p_i=i\)),于是问题变成了求 \(\displaystyle\left|\bigcap_{i=1}^k s_i\right|\)。
上式的意思是 \(k\) 个元素满足 \(p_i=i\) ,剩下的随便排的方案数,所以是 \((n-k)!\) 。
于是整个式子就变成了\[\begin{aligned} d_n&=\sum_{i=1}^n(-1)^{i-1}\binom ni(n-i)!\\ &=\sum_{i=1}^n(-1)^{i-1}\frac{n!}{i!}\\ &=n!\sum_{i=1}^n\frac{(-1)^{i-1}}{i!} \end{aligned} \]