本文以一些简单的题目为例,来研究一下群论及Polya计数在OI中的应用
注:本文无代码,仅介绍题目的思路和技巧,且难度较低,因为这些题目并不难写,在知道思路以后相信大家都能写出来,其实是因为我的代码写的太丑了,之后还会给一些有难度的题目另开博文
codevs 2845 传送门
置换群相关题目
刘汝佳的黑书上讲得十分详细,我这里再简单提一下
整个数列可以划分为若干个互不相交的循环,每个大小为
sizi
的循环
i
都要进行
∑sumi+mini×(sizi−2)
sumi
表示循环
i
中所有数的总和
不过这不一定是最优解,因为还有可能是让全局最小值
所以最终答案是
∑sumi+min(mini×(sizi−2),mini+Min×(sizi+1))
BZOJ 1025 传送门
置换群相关题目
其实和置换关系不是特别大……
每种对应关系会让排列形成若干个互不相交的循环,排数就是这些循环大小的最小公倍数
这样问题就变成了“给定若干个正整数,它们的和为n,求它们可能的最小公倍数的种类数”
这问题纠结了我一会儿……后来猛然发现是个zz问题……
我们知道最小公倍数的质因子指数实际上是所有数中质因子指数的最大值,那么对于有“相同的最小公倍数”的集合来说,数数之间两两互质的集合的总和更小,换句话来说,令集合中每个数都是互不相同的质数的若干次方,那么这个集合的总和最小
然后就可以dp了,
f[i][j]
表示dp到第i个质数,当前总和为j的方案数,然后暴力枚举指数就可以了
推荐记忆化搜索
POJ2409 传送门
Polya相关题目
裸题
不过我这里还是详细讲一下好了
我们先看旋转操作
在旋转i格的情况下,会有
gcd(i,n)
个循环,循环长度为
ngcd(i,n)
我有一个证明
考虑从一个点出发开始旋转,至少要转x次才能回到原点,那么就是
xi=0 (mod n)
由于x要求最小,又因为
i|xi,n|xi
,那么
xi=lcm(i,n)=nigcd(i,n)
所以
x=ngcd(i,n)
循环长度就是
ngcd(i,n)
了,循环个数也就显而易见了
所以旋转的不动点数就是
∑ni=1cgcd(i,n)
这里范围比较小,直接做就可以了
翻折的话分开讨论下
如果n为奇数,那么每条对称轴的翻折就都是有
(n−1)/2+1
个循环,1个长度为1和(n-1)/2个长度为2的
如果n为偶数,那么点点对称轴有
(n−2)/2+2
个循环,2个长度为1和(n-2)/2个长度为2的;边边对称轴有
n/2
个循环,n/2个长度为2的。
POJ1286更为简单,颜色数是给出的
codevs2926 传送门
Polya相关题目
也是裸题
不过这好像是我写的第一道Polya,所以是暴力乱搞的……
一共6种置换方式,旋转0°,120°,240°和翻折后旋转
要写高精加,高精乘单精和高精除单精
感觉爽翻了……
BZOJ1004 传送门
Polya相关题目
其实是DP……
考虑用dp来统计不动点数量,这就要求在某一置换下同一循环内的元素必须染色相同,然后DP搞就可以了,状态我就不说了,肯定都会……
TJU2795 传送门
Polya相关题目
也是考虑同一循环内元素颜色相同
其实也是裸题……
注意一下就是统计答案时实际上是若干个元素(循环)排列,还要除去颜色相同的循环的排列(算一下阶乘就好了……)
其实是多重集排列
求解过程记录质因子及次数,然后乘起来加到答案里就好
把codevs2926的高精板子搬过来正好用上
UVA10601 传送门(我在vjudge上交的)
Polya相关题目
有24种置换方式
对棱中点为对称轴旋转180°,对面中点为对称轴旋转90°、180°、270°,体对角线为对称轴旋转120°,240°。
前两种很好想,但我纠结了半天体对角线旋转多少度会与本身重合,因为身边没有魔方,拿着具体数学摆弄了好久
其实看成正三棱锥就很容易了,因为它的底面是正三角形
剩下的就是随便做了
POJ 2154 传送门
Polya相关题目
做完上面的题,一眼就看出来答案是什么了
数论优化求解
let gcd(i,n)=d
let i=di
然后 O(n√) 筛因数并求解就可以了
总结
最简单的题目套公式
次简单的题目简单分析过后通过快速幂,阶乘等计算答案
不良心的出题人非让你写高精度
有一点难度的题目要用dp或者数论的优化
更难的题目吗……
其实我本来在做,但因为太蛋疼了所以就过来写了这篇博客(/▽\)