计数组合小记
什么是计数组合?它是组合学的分支,研究计算满足某个条件的组合对象的方案数的方法。
有时方案数很难具体求出,此时我们可以转而关心方案的数量级,这就是解析组合(需要用到复分析工具)
1.组合数的基本性质以及排列组合
首先给出最基础的\(2\)种计数方法:加法原理和乘法原理(定理1.1,1.2)
这两个原理基于集合的性质:当有限集\(A,B\)的交集为空时\(|A\cup B|=|A|+|B|\),并且对于任意有限集\(A,B\),\(|A\times B|=|\{(a,b):a\in A,b\in B\}|=|A||B|\)
这说明假设满足条件\(1,2\)的组合类的数量分别是\(a,b\)并且满足这两个条件的组合类不相交,那么满足条件\(1\)或者\(2\)的组合类个数是\(a+b\)。
假设满足条件\(1,2,...,n\)的组合类的数量是\(a_1,a_2,...,a_n\),那么使得\(b_1...b_n\)分别满足条件\(1...n\)的\(n\)元组\((b_1,...,b_n)\)数量是\(a_1a_2...a_n\)。
例1.3:长度为\(n\)的每个字符都为\(0\)或者\(1\)的串,根据乘法原理共有\(2^n\)个。
我们经常需要计算形如从\(n\)个数中选出\(k\)个有多少种方案的问题
形式化的,考虑如下问题:给定集合\(S\),\(|S|=n\),有多少种方案能把\(S\)中的元素排成一个序列\(a\),使得\(S\)的每个元素在\(a\)中恰好出现一次?
序列\(A,B\)不同当且仅当存在\(i\)使得\(A_i\neq B_i\)
显然第一个数有\(n\)种选法,第二个数有\(n-1\)种选法...第\(k\)个数有\(n-k+1\)种选法
所以根据乘法原理共有\(n(n-1)...(n-k+1)=\frac{n!}{(n-k)!}\)种选法。这就是定理1.4:排列数
约定组合数\(\binom{n}{k}\):从\(n\)个元素构成的集合\(S\)中选出\(k\)个数,求这\(k\)个数能组成的集合的个数。
当且仅当\(n,k\)是正整数组合数才有定义。
要求\(0\leq k\leq n\),其他情况这个组合数的值等于\(0\)。
定理1.5:\(\binom{n}{k}=\frac{n!}{(n-k)!k!}\)
证明:根据定理1.4,共有\(\frac{n!}{(n-k)!}\)个由\(S\)中的元素组成的排列。
对于每个\(S\)的大小为\(k\)的子集\(T\),它对应着\(k!\)个不同的由\(S\)的\(k\)排列(将\(T\)的元素任意排列即可得到\(k!\)个方案),并且不同集合对应的排列显然不同。
所以\(k!\)个排列会对应一个大小为\(k\)的子集,共有\(\binom{n}{k}=\frac{n!}{(n-k)!k!}\)种方案。
组合数有如下基本性质:
1.\(\binom{n}{k}=\binom{n-1}{k-1}+\binom{n-1}{k}\).
证明:假设我们从集合\([n]\)中选\(k\)个数求方案,我们枚举\(n\)有没有被选,如果它被选/没被选,共有\(\binom{n-1}{k-1}\)/\(\binom{n-1}{k}\)种方案。
根据加法原理得证。
2.\(k\binom{n}{k}=\frac{n!k}{(n-k)!k!}=\frac{n(n-1)!}{(n-k)!(k-1)!}=n\binom{n-1}{k-1}\)
3.\(\binom{n+m}{k}=\sum_{i=0}^k\binom{n}{i}\binom{m}{k-i}\)。
证明:假设我们从集合\([n+m]\)中选\(k\)个数求方案,我们枚举前\(n\)个数被选的个数\(i\),后\(m\)个数被选了\(k-i\)个。
根据乘法原理共有\(\binom{n}{i}\binom{m}{k-i}\)种方案。
此恒等式被称为范德蒙德恒等式,但是中国的朱世杰在14世纪就发现了它。
4.(广义)二项式定理:拓展组合数的定义,我们允许\(k\)是实数,但是\(i\)必须是非负整数。
定义\(\binom{k}{i}=\frac{k(k-1)...(k-i+1)}{i!}\)
\((1+x)^k=\sum_{i\geq 0}^{\inf}x^i\binom{k}{i}\)
证明:泰勒展开,对\((1+x)^k\)求\(i\)次导数得到\(k(k-1)...(k-i+1)(1+x)^{k-i}\)。
取\(x=0\)得到 \(k(k-1)...(k-i+1)\),所以\((1+x)^k=\sum_{i\geq 0}^{\inf}x^i\frac{k(k-1)...(k-i+1)}{i!}=\sum_{i\geq 0}^{\inf}x^i\binom{k}{i}\).
这个定理可以用于计算带根式的生成函数。
5.凸性:\(f(k)=\binom{k}{i}=\frac{k(k-1)...(k-i+1)}{i!}\)在\(k\geq i\)时为凸函数
证明略过
6.\(\sum_{i=0}^n\binom{n}{i}=2^n\)
证明:右式为从\([n]\)中选出任意个数的方案数。
如果我们选了\(i\)个数,共有\(\binom{n}{i}\)种方案。所以总方案是\(2^n\)。
2.双射/算两次证明
个人认为它们是组合学中最基础的两种证明方法
首先是算两次:显然对于某个组合对象,我们使用两种不同的方法计算它的个数。
这可以列出组合恒等式。
比如:为了计算一个矩阵的元素的和,我们可以对所有行的和求和,也可以对所有的列的和求和。
所以矩阵所有行的和=所有列的和。
比如:计算\(\sum_{i=1}\)
双射证明也可用于证明组合等式。
考虑两个组合对象\(A,B\),如果我们能构造函数\(f,g\),使得对于所有\(x\in A\),\(f(g(x))=x,g(f(x))=x\),那么\(A,B\)的个数就是相等的。
构造双射常用的方法:联想法,将已知的组合对象与我们要计数的对象/我们要计算的公式的某项构造双射。
归纳法:归纳构造双射。
等价法:将我们想求出大小的的组合类\(A\)与另一个对象\(B\)构造双射,再把\(B\)和我们能计算方案数的对象\(C\)构造双射
3.容斥原理与二项式反演
4.单位根反演
5.级数与其运算
我们通常会用到以下\(3\)种级数:
1.多项式级数:\(A(x)=\sum_{n\geq 0}a_nx^n,[x^n]A(x)=a_n\)。它能够解决很多(而且是在OI里大部分)计数问题。
定义加法操作:\(A(x)=\sum_{n\geq 0}a_nx^n,B(x)=\sum_{n\geq 0}b_nx^n\)
\(A(x)+B(x)=\sum_{n\geq 0}(a_n+b_n)x^n\).
定义乘法操作:\(A(x)B(x)=\sum_{n\geq 0}\sum_{k=0}^n(a_{n-k}b_k)x^n\).
2.形式Laurent级数
与多项式级数相似,但是允许存在幂次为负数的项(但是这种项只能有有限个):
定义\(A(x)=\sum_{n\geq M}a_nx^n,[x^n]A(x)=a_n\), \(M\)是负数\(。对于所有\)n<M\(,定义\)a_n=0\(.
定义加法操作:\)A(x)=\sum_{n\geq M}a_nx^n,B(x)=\sum_{n\geq N}b_nx^n\(
\)A(x)+B(x)=\sum_{n\geq \min(N,M)}(a_n+b_n)x^n\(.
定义乘法操作:\)A(x)B(x)=\sum_{n\geq N+M}\sum_{k=0}{\inf}(a_{n-k}b_k)xn,B(x)=\sum_{n\geq 0}b_nx^n\(。
定义形式留数:\)[x^{-1}]A(x)$
在使用形式Laurent级数时,需要注意两点:
6.字符串计数
定义字符串:给定一个字符集
7.格路
8.普通型生成函数
9.分式递推关系
本部分讨论如何使用分式求出递推关系的通项。
10.指数型生成函数
11.特殊的组合对象

浙公网安备 33010602011771号