阅读了 <Pólya 计数法的应用> 一文, 对里面的例题做一下笔记. >_<
- [UVA 10601] Cubes 用 12 根有颜色的等长棍子搭立方体, 旋转后颜色相同的方案算一种, 求方案数.
- [SPOJ 419] [SPOJ 422] Transportation is fun 给一个 2^a 2^b 的矩阵, 在内存中从上往下, 从左往右连续存放. 用交换操作求它的转置矩阵, 存储方式相同, 求最小步数.
- [SGU 282] Isomorphism 染色图是边带颜色的无向完全图. 求 N 个顶点, M 种颜色 (不必用完), 两两不同构的染色图个数模质数 P. (1 ≤ N ≤ 53, 1 ≤ M ≤ 1000, N < P ≤ 10^9)
Burnside 引理
考虑
[UVA 10601] Cubes
所有置换是三种基本置换的复合, 打个表, 发现共有 24 个, 按照循环的大小可分为以下 5 类:
1 1 1 1 1 1 1 1 1 1 1 1 (1 个)
1 1 2 2 2 2 2 (6 个)
2 2 2 2 2 2 (3 个)
3 3 3 3 (8 个)
4 4 4 (6 个)
除了第 2 类, 全都是相等的元素: 考察每种颜色用在哪里, 组合数计算方案数, 每种颜色的方案数相乘. 对于第 2 类, 先枚举一下哪两条边对应1
.
如果没有这样的特征还不大好算......状压 DP.
[SPOJ 419] [SPOJ 422] Transportation is fun
看起来不像等价类计数问题, 但是可以往这个方向转化.
原位置到目标位置的对应关系构成一个置换. 最优交换方式是直接换......对于一个长度为l
的循环, 最少用l-1
次交换使其复位. 设置换可以分解为m
个循环, 则ans = 2^(a+b) - m
.
地址和长度为 a+b 的 01 串一一对应. (i,j) 的地址为i 2^b + j (0 <= i < 2^a, 0 <= j < 2^b)
, 可以看到其二进制表示就是i的二进制表示 ++ j的二进制表示
, 高位用 0 补齐. 那么, (i,j) 变到 (j,i) 就是 01 串循环右移 b 位.
我们要求(i,j) -> (j,i)
这个置换的循环的个数, 也就是在循环右移 b 位
这个置换下等价类的数目. 可以用 Burnside 引理解决, 推导与b=1
的情形类似,
[SGU 282] Isomorphism
同构问题也是等价类计数问题. 我们借助较为简单的点的置换来考虑边的置换.
设一个点的置换
一条边
枚举
和 [UVA 10601] Cubes 的思想类似. 循环大小的构成相同的置换可以一起计算不动点的数目.