信息学中的组合数学
本文为对于唐文斌的《信息学中的组合数学》的一个总结。
基础知识
排列与组合
组合数:从(N)个元素中选取(M)个元素,选取顺序无关,记做(C(N, M))。
(C(N, M)=frac{N!}{M!(N-M)!}=C(N-1, M-1)+C(N-1, M))
排列数:从(N)个元素中选取(M)个元素,选取顺序有关,记做(P(N, M))。
(P(N, M)=frac{N!}{(N-M)!})
容斥原理
设有(n)条件(A),满足至少一个条件的答案
(|A_1 cup A_2 cup ... cup A_n|=(|A_1|+|A_2|+...+|A_n|)-(|A_1 cap A_2|+|A_1 cap A_2|+...+|A_1 cap A_n|+...+|A_{n-1} cap A_n|)+...+(-1)^{n-1}|A_1 cap A_2 cap ... cap A_n|)
欧拉函数
欧拉函数(varphi(n))是小于(n)且与(n)互质的数的个数.
设(p_i)为(n)的质因子,(n)共有(k)个质因子,则
群
给定一个集合(G)和二元运算(“·”),满足:
封闭性:若(a,b in G),则(a·b in G)。
结合律:((a·b)·c=a·(b·c))。
存在单位元(e:a·e=e·a=a)。
存在逆元素:(b=a-1,a·b=b·a=e)。
那么就称集合(G)在运算(“·”)下是一个群。
置换群
由置换组成的群。
一个置换就是一个n元集合到其自身的一一映射。例如
Burnside引理
设(G)是(N=){(1,2,3,…,n)}上的置换群,(G)在(N)上可引出不同的等价类,其不同的等价类个数
其中(c_1(a_k))表示在置换(a_k)作用下保持不变的元素的个数。
Pólya定理
(m)着色,在某个置换(P)下, 不动点个数:(m^{c(P)}),(c(P))为置换(P)的循环个数.
不相邻的组合
题目描述:给定(N)个球排成一行, 取(M)个不相邻的球的方案个数。
solution
这道题的DP方法比较简单,所以这里就不讨论了。
假设第(i)个球取得位置是(a_i),那么(a_i+1<a_{i+1}),设(b_i=a_i-(i-1))(然而我并不知道这个是怎样想出来的),那么(b_i<b_{i+1}),所以答案就是(C(n-(m-1), m)).
扩展:(n)个球围成环。
只要把第一个数是否选择进行分类即可。
逆序对排列数
题目描述:包含(K)个逆序对的长度为(N)的排列个数。
solution
DP, 设(f[i][j])为决策到数字(i),有(j)个逆序对的排列数。
加个部分和就可以变成(O(n^2)).
堆的种类
题目描述:将(1…n)按任意顺序插入堆中,求不同的堆的个数,输出方案数模(m)。
solution
设(f[i])为堆的元素的个数,枚举左儿子的个数(j),
Permutation Counting
题目描述:求满足有(k)个位置(a_i>i)的(n)排列个数
solution
假设一个排列(a),(i)向(a_i)连边,题目的条件就是向后连的边。设(f[i][j])表示长度为(i)的排列,有(j)个位置满足条件,现考虑把(i)插入。
假设位置(j)与(i)的值交换,
1、位置(j)向后连边。那么交换后(j)依然向后连边,而(i)则是向前连边,所以向后连得边的数量不变。
2、位置(j)向前或自己连边。那么交换后(j)向后连边,(i)则是向前连边,所以向后连边的数量加一。
3、数字(i)就放在位置(i),向后连得边的数量不变。
着色方案
题目描述:有(n)个木块排成一行,现在有(k)种油漆,第(i)种油漆恰好足够给(c_i)个木块染色,且(c_1+c_2+…+c_k=n)。求任意两个相邻的木块不同色的方案数。
solution
由于数据比较小, 所以设一个(c+1)维数组,第(i)维表示剩下(i)次的油漆有多少种以及最后用的那种油漆还剩多少。递推式比较难表达,但比较容易想,这里就不写了。
生成树计数
题目描述:(N)个点成链状,距离不超过(k)的有边相连。求生成树个数。
solution
因为(k)最大是(5),(k)个点的连通性用最小表示法表示后只有(52)种状态, 现新加一个点,删掉最前的点,状态转移可以求出。构造状态转移矩阵,用矩阵乘法求解。
互质求和
题目描述:求出所有与(n)互质的数的和。
solution
设(p_i)为(n)的质因子,(n)共有(k)个质因子,则
带约束的整数方程
题目描述:求方程(x_1+x_2+…+x_m=n)的解的个数.满足:
(L_i≤x_i≤R_i)
solution
令(y_i=x_i-L_i, n=n-sum_{i=1}^m L_i),则原题变为
设(f[i][j])为前(i)个(y_i)的和为(j)的方案数。DP即可求解。
Candy
题目描述:有(n)种糖果,第(i)种糖果有(m_i)个,求吃掉至少(a)个,不超过(b)个糖果的方案数模2004。
solution
问题可转化为求吃掉不超过(lim)个糖果的方案数,答案为不超过(b)的方案减去不超过(a-1)的方案。
假设每种糖果没有上限,那么答案就是(C_{lim+n-1}^{n-1}),由于现在有上限,所以可以尝试用容斥原理,就可以算出全都没有超出的方案数。
假设超出上限的糖果为(x_i),也就是说这些糖果至少吃了(sum_i (m_{x_i}+1))颗,那么可以用(lim)减去这些糖果,那么现在对于每种糖果都没有上限了,就可以直接用组合数求解。
COCI 2010R4. Palacinke
题目描述:有(n)个点(m)条单向边的图,每条边上有BJMP四种东西中的若干样。现在要从节点(1)出发,经过(T)条边之后回到节点(1),满足经过的这些边上BJMP都出现了的方案数模5557。
solution
设(f[i][j][sett])表示经过(i)条边后到达(j)号点,且BJMP集合为(sett)的方案数。由于(T)比较大,且(f[i])只与(f[i-1])有关,所以考虑构造状态转移矩阵,然后用矩阵乘法求解。时间复杂度是(O((2^4n)^3logT)),还是会超时,所以要压缩一下转移矩阵的大小。
可以考虑用容斥原理,枚举经过的边上集合要是哪个集合的子集。因为到达终点有BJMP的方案=-经过B子集的边-经过J子集的边-经过M子集的边-经过P子集的边+经过BJ子集的边+...+经过BJMP子集的边。那么只需枚举集合,状态转移矩阵就变成(n*n).时间复杂度变成(O(2^4n^3logT))
置换开根
题目描述:给定一个置换(p), 求置换(q)满足: (q^2=p)
solution
一个置换可以看成很多个环,一个偶环的平方可能是两个偶环,也可能是两个奇环,一个奇环的平方还是一个奇环,根据这个来构造解即可。
其实对于群,置换之类的知识我也不是很熟悉,也不打算深入了解,所以就在此置笔了。