信息学中的组合数学
信息学中的组合数学
本文为对于唐文斌的《信息学中的组合数学》的一个总结。
基础知识
排列与组合
组合数:从\(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
一个置换可以看成很多个环,一个偶环的平方可能是两个偶环,也可能是两个奇环,一个奇环的平方还是一个奇环,根据这个来构造解即可。
其实对于群,置换之类的知识我也不是很熟悉,也不打算深入了解,所以就在此置笔了。