计数问题学习笔记
codesonic
2019-11-17 22:05:07
# 基础知识
## 排列组合
### 排列
从$n$个数字有序地选择$k$个数字的方案数。
第一个数字有$n$种选择方案,第二个有$n-1$
于是答案为$n(n-1)(n-2)...(n-k+1)=\frac{n!}{(n-k)!}=n^{\underline{k}}$。($n^{\underline{k}}$指n的k次下降幂)
记为$P_n^k,A_n^k,{n\choose k}*k!$
前两个好像是苏联的符号...?
### 组合
从$n$个数字个数字无序地选择$k$个数字的方案数。
因为无序,在排列的基础上除以$k!$即可
记为$C_n^k,{n\choose k}$
同样地,国际上都喜欢用第二种。
### 二项式定理
$(x+1)^n$中$x^k$前的系数。
等价于$n$个单项式中选$k$个取$x$,其余取$1$
展开式:
$$(x+y)^n=\sum_{k=0}^n{n \choose k}x^ky^{n-k}$$
### 广义二项式定理
求$(x+y)^a$ (a是有理数)
$$(x+y)^a=\sum^{\infty}_{k=0}\frac{a^{\underline{k}}}{k!}x^ky^{(a-k)}$$
如果是正整数显然能那个分数能对应成刚刚的组合数
其他情况要泰勒展开,我不会。
### 隔板法
n个一样的球放进m个不同的盒子,能不放,求方案数
把n个东西划分成m段,可以强行加m个球要求不能不放,那么就是在n+m-1个划分点选m-1个
答案为${n+m-1 \choose m-1}={n+m-1 \choose n}$
以上是最简单的排列组合,下面的东西可能会让人懵掉。
## 计数原理
### 抽屉原理
把$kx+b(0<b<x)$个物品放进$x$个盒子内,至少有一个盒子内有$k+1$个东西
### 加法原理
事件$A$有$n$个结局,事件$B$有m种结局,发生了一个事件,共有$(n+m)$种结局
若干不交的集合取一个的方案数,等于集合大小的和。
### 乘法原理
事件$A$有$n$个结局,事件$B$有$m$个结局,两个事件都发生了,共有$nm$种结局
若干不交的集合格取一个的方案数,等于集合大小的乘积。
以上计数原理是计数的基石,虽然很浅显但是在后面的知识中扮演关键的角色、
## 特殊数列
### 卡特兰数
定义式:
$$h_n=\sum^{n-1}_{k=0}h_kh_{n-1-k}(h_0=h_1=1)$$
通项式:
$$h_n={2n \choose n}-{2n \choose n-1}=\frac{{2n \choose n}}{n+1}$$
应用场景很多
括号序列数量/$n\times n$方格行走数(不能越过对角线),凸多边形划分数,二叉树数量
用方格行走推导$h_n={2n \choose n}-{2n \choose n-1}$:
将模型转换成这样:
![](https://cdn.luogu.com.cn/upload/image_hosting/pkcg7ezl.png)
然后不能越过下面的直线
我们要走n次向上,n次向下,共2n次,这样我们才能回到0。
先忽略不能越过下面的直线,那就是在2n步中选出n步向上走,为${2n \choose n}$
接下来减掉不合法的,如果越过了这个线,那么这时我们把终点(n,0),改成(n,,-2),进行一次**翻转**,就只需要走n+1步向下,n-1步向上,答案为${2n \choose n-1}$,这是一个**反射法**的经典应用。
${2n \choose n}-{2n \choose n-1}=\frac{{2n \choose n}}{n+1}$可以用数学方法证明~~留与读者自证~~
### 第一类斯特林数
用$S_u(n,m)$表示n个不同元素构成m个圆排列的方案数
1.最后一个元素单独做环
2.插入之前的m个环中
$$S_u(n,m)=S_u(n-1,m-1)+(n-1)*S_u(n-1,m)$$
第一类斯特林数有时候有符号,在生成函数上应用较多,记为$S_s$
$$S_s(n,m)=(-1)^{n+m}S_u(n,m)$$
有符号的斯特林数的生成函数为$x^{\underline{n}}$,这个结论非常重要,有了这个可以快速求斯特林数
建议明白生成函数后再回来看
### 第二类斯特林数
$S(n,m)$表示把$n$个不同元素拆分进$m$个非空集合的方案数,集合不为空
$$S(n,m)=S(n-1,m-1)+m*S(n-1,m)$$
类似于第一类斯特林数,考虑当前元素再新建一个集合和加入之前的集合即可。
$$S(n,m)=\frac{1}{m!}\sum(-1)^k{m \choose k}(m-k)$$
这个式子可以用卷积快速计算,但是因为本篇主题是计数,所以不展开。
贝尔数(不要求划分成几个集合)是第二类斯特林数之和。
### 拆分数
$f_n$表示大小为n的正整数拆分成若干无序的正整数和的方案数
有两种DP方法
1$.f_{i,j}$表示拆分成若干不超过j的方案数
$$f_{i,j}=f_{i-j,j}+f_{i,j-1}$$
2.$g_{i,j}$表示拆分j个数字的方案数
$$g_{i,j}=g_{i-1,j-1}+g_{i-j,j}$$
两个DP复杂度都是平方级别的。
考虑大小超过$\sqrt{n}$的数字最多只有$\sqrt{n}$个,结合两种DP,复杂度$O(n\sqrt{n})$
用第一个DP考虑小的数字,用第二个DP考虑大的数字,先用f算出$\sqrt{n}$以内的答案,g的方程就可以改为$g_{i,j}=g_{i-\sqrt{n},j-1}+g_{i-j,j}$
拆分数也有生成函数,为:
$$\frac{1}{\Sigma(-1)^kx^{k(3k\pm 1)}}$$
下面这个分母是带符号的五边形数
如果把拆分出来的正整数想象成柱形图,那么这两种方法一种是按列考虑,一种按行考虑。
# 生成函数
>生成函数的应用简单来说在于研究未知(通项)数列规律,用这种方法在给出递推式的情况下求出数列的通项
## 多项式与形式幂级数
形式幂级数的定义:
$$\sum _{n\geq 0}a_nx^n$$
可以认为是一个有无穷次项的多项式,所有次项都为正
加减法:
$$\sum _{n\geq 0}a_nx^n\pm \sum _{n\geq 0}b_nx^n=\sum _{n\geq 0} (a_n\pm b_n)x^n$$
乘法:
$$\sum _{n\geq 0}a_nx^n\times \sum _{n\geq 0}b_nx^n=\sum_{n\geq 0}(\sum _{k=0}^na_kb_{n-k}x^n)$$
类似于多项式的加减法和乘法
## 闭形式
形式幂级数的表达形式是一个长度无穷的多项式,但是对于部分的形式幂级数,存在长度有限的函数能够直接表示它,则称之为闭形
式。
比如等比数列:
$$\sum _{n \geq0}x^n=\frac{1}{1-x}$$
$$\sum _{n \geq1}x^n=x\sum _{n \geq0}x^n=\frac{x}{1-x}$$
意义:把无穷长度的形式幂级数改写为有限长度的闭形式
## 组合对象
组合计数是一类常见问题,通常给定我们若干组合条件,对于每个组合对象,有某个函数 $size$ 衡量了它的大小,如图的节点数,序列的长度等。$size$ 为 $n$ 的个数为有限个,记为$A_n $,求某个$A_n.$
这些图,序列等就是组合对象。
组合对象分为是否有标号的两种,指的是是否考虑组合对象内部的元素有不同的区别,例如无标号的三个点的图只有 4 种,而有标号的有 8 种。
## 普通生成函数
数列$A_0,A_1,A_2...$的普通生成函数为
$$\sum _{n \geq 0}A_nx^n$$
普通生成函数通常考虑无标号问题,它的加法操作和乘法操作分别对应了并和拼接两种操作。
### 斐波那契数
$f_n$表示第n个斐波那契数,求$\sum_{n \geq 0}f_nx^n$的闭形式
令
$$F(x)=\sum_{n\geq0}f_nx^n$$
由于$f_n=f_{n-1}+f_{n-2}$可得
$$F(x)=xF(x)+x^2F(x)+1$$
解方程得
$$F(x)=\frac{1}{1-x-x^2}$$
分解质因数后裂项,可得到通项公式。
### 卡特兰数
求节点数为n的二叉树个数
生成函数本身具有组合性质,令$F(x)$表示该问题的生成函数,一棵二叉树可以划分成根节点和左右子树,是两个完整都二叉树,
所以$F(x)=xF^2(x)+1$,解方程可得$F(x)=\frac{1-\sqrt{1-4x}}{2x}$
通过泰勒展开可以求得通项公式。
因为我不会 也不是主题内容,所以不展开
## 指数生成函数
指数生成函数一般用来解决有标号问题
数列$A_0,A_1,A_2...$的指数生成函数为
$$\sum _{n \geq 0}\frac{A_n}{n!}x^n$$
### 连通图计数
考虑到任意图可以被划分成若干连通图。
定义连通图的生成函数为$F(x)$,任意图的生成函数为$G(x)$。
很容易求出任意图的生成函数,即
$$G(X)=\sum _{n\geq 0}\frac{2^{n(n-1)/2}}{n!}x^n$$
任意图是由连通图构成的,所以$G(x)=e^{F(x)}$,所以F(x)=ln G(x),通过多项式姿势可以快速求出来
# Polya定理
## Burnside 引理
### 置换
置换就是对元素进行重新排列,必须(类似于线性代数中的**线性映射**)。
比如,把正方体旋转90度,可以看做四个顶点的一个置换
有以下结论:
置换可以构成环:从一个元素置换前到置换后连一条有向边,会构成环(循环)
定义一个状态S经过置换后与原来相同,则称其为不动点。
### 置换群
置换群指的是一个置换的集合,满足任意两个置换不能复合出一个新的不在集合内的置换。
### Burnside 引理
令$X$表示某个集合,$G$表示某个作用在X上的某个置换群。对于任意$G$内的元素$g$,定义$f(g)$为$X$内经过置换$g$后不变的元素数量,我们要求$X$内本质不同的元素个数(本质不同指不能通过$G$获得彼此),这个个数记为$|X/G|$
(这也被称为**等价类**,求的也就是等价类个数)
形象地说,比如某个集合:
![](https://cdn.luogu.com.cn/upload/image_hosting/nk4kqj4t.png)
然后有一个置换为逆时针旋转60度,那这两个元素本质相同。
Burnside 引理为:
$$|X/G|=\frac{1}{|G|}\sum_{g\in G}f(g)$$
证明:
> 我们发现一个元素是不是不动点需要考虑两个东西:一是元素本身,二是置换,所以不动点是**二元**的
例子:
> 一个正方形分成4格,涂上黑白两种颜色,有多少种方案?其中经过转动相同图像的算一种方案
本来可以直接枚举,但是我们要验证Burnside ,所以对其加以考虑。
在这个正方形上的置换有:
(1)顺时针转90度,(2)逆时针转90度,(3)不动,(4)直接转动180度
先把所有正方形画出来
![](https://cdn.luogu.com.cn/upload/image_hosting/mm8421fo.png)
然后按从上到下 从左到右一行一行编号为(1)~(16)
其中对于每个置换,列出不动点:
(1):2个
(2):2个
(3):16个
(4):4个
$$|X/G|=\frac{1}{|G|}\sum_{g\in G}f(g)=\frac{1}{4}(2+2+16+4)=6$$
### Polya定理
设$G$是$X$的一个置换群,$|X|$=n,用$m$种颜色染色,本质不同的方案数:
$$L=\frac{1}{G}\sum_{g\in G}m^{c(g)}$$
$c(g)$表示$g$的循环节个数。
通常我们并不枚举所有的$g$,并计算$c(g)$,而是枚举 $c(g)$,快速计算多少$g$满足条件。
仍然将一个正方形分成4格,涂上黑白两种颜色,有多少种方案?其中经过转动相同图像的算一种方案
在这个正方形上的置换有:
不动:4
旋转90度 :1
旋转180度 :2
旋转270度:1
$M=\frac{1}{4}(2^4+2^1+2^2+2^1)=6$
# 生成树计数
## 度数矩阵,邻接矩阵和基尔霍夫(Kirchhoff)矩阵
对于一个无向图$G$,定义$G$的度数矩阵$D$满足:
$$d_{i,j}=\begin{cases} deg_i\space\space\space(i=j)\\0\space \space\space\space\space\space\space\space(i\ne j)\end{cases}$$
其中,$deg_i$表示节点i的度数
定义$G$的邻接矩阵$C$满足:
$$c_{i,j}=\begin{cases} 0\space\space\space\space\space\space\space\space\space\space(i=j)\\adj_{i,j}\space \space\space(i\ne j)\end{cases}$$
定义$G$的基尔霍夫矩阵$L$:$L=D-G$,也就是:
$$l_{i,j}=\begin{cases} deg_i\space\space\space\space\space\space\space\space(i=j)\\-adj_{i,j}\space \space\space(i\ne j)\end{cases}$$
## 行列式
定义:一个矩阵$A$的行列式表示为:
$$|A|=\sum _p(-1)^{\sigma(p)}\prod_{i=1}^na_{i,p_i}$$
性质:
1.一个对角矩阵/上三角矩阵的行列式值是所有对角线上元素的乘积。
2.交换矩阵的两行/两列,行列式值取反
3.将矩阵的一行/一列乘上一个固定的常数 k,行列式值也乘上 k。
4.将矩阵的一行加到另外一行上去,行列式值不变,列同理。
可以使用高斯消元快速计算行列式。
## 矩阵树(Matrix-Tree)定理
图$G$的生成树数量是依照以上步骤求出来的基尔霍夫矩阵$L$的行列式的任意一个代数余子式。
也就是说随意取它的任意一个$n-1$阶主子式,然后求出主子式的值,得到的就是在这个图中生成树的数量。
代码:咕咕咕
计数笔记就到这里结束了,以后可能会补一些例题什么的~
接下来大概要学线代和数论/多项式~