解题报告 (五) Burnside引理和Polya定理
作者:互联网
Burnside引理
笔者第一次看到Burnside引理那个公式的时候一头雾水,找了本组合数学的书一看,全是概念。后来慢慢从Polya定理开始,做了一些题总算理解了。本文将从最简单的例子出发,解释Burnside引理和Polya定理。然后提供一些自己做过的和上述定理相关的题目和解题报告。
Burnside引理是为了解决m种颜色给n个对象染色的计数问题。
【例题1】如图1所示,2×2方格中每个格子可以选择染上2种颜色(红色或白色)。那么总共是2^4=16种情况。现在要问,如果旋转0度、90度、180度、270度后状态不变的方案算成同一种方案,问总共有多少种不同的方案。
图1
将每种旋转认为是一种"置换",定义为gi,则上述问题总共有4种置换,分别描述为:
图2
用D(gi)表示在gi这种"置换"的作用下没有改变状态的方案集合,则根据图2易得:
图3
用|D(gi)|代表集合D(gi)中元素的个数,则有Burnside引理表示如图4所示:
图4
L代表m种颜色给n个对象染色的总方案数,|G|代表置换个数,|D(gi)|代表在gi这种置换作用下没有改变状态的方案个数。
上文中的例子套用Burnside引理就是 L = (16+2+4+2)/4 = 6。
这道题几乎是所有解释Burnside引理的文章都会提到的一个例子,因为它看起来很直观,然而当染色数或对象数逐渐增多时,方案数呈指数级增长,再来举个例子。
【例题2】一个3×3的方格,用10种颜色给每个格子染色,旋转0度、90度、180度、270度后相同的算成相同,问总共有多少种方案。
图5
给每个格子编个号,每个格子有10种颜色,总共9个格子,总情况数10^9,已经没办法枚举出来了。继续从Burnside引理的定义出发,|D(gi)|代表在gi这种置换作用下没有改变状态的方案个数,置换总共四种,那么我们将这四种置换都列出来:
1)旋转0度:也就是我们将这个3×3的方格旋转0度后,有多少种方案是没有改变状态的,答案很显然,就是10^9。也就是说,无论你哪个格子染成什么颜色都没关系,旋转0度前后状态不变(这是显然的)。
2)旋转90度:①③⑦⑨循环变换、②④⑥⑧循环变换,⑤永远不变。表示成置换群的乘积就是(1379)(2468)(5)。那么我们发现,只要在同一个循环中的格子颜色一致,则在这种置换下状态永远不会改变。所以(1379)可以取10种颜色、(2468)可以取10种颜色、(5)可以取10种颜色,总方案数10^3。
3)旋转180度:置换群为(19)(28)(37)(46)(5),总方案数10^5。
4)旋转270度:类似旋转90度的,方案数10^3。
所以根据Burnside引理,总方案数就是(10^9 + 10^3 + 10^5 + 10^3)/4。
根据这个例子,就可以很好的理解Polya定理了。
Polya定理
图6
m种颜色给n个对象染色的方案数如图所示。G代表变换(置换)的种类,其中Ci代表每种置换下的循环节。
模拟置换群的求法,累加循环节-1
Polya定理+模拟
Polya定理+模拟
Polya定理+PKU 2409的简化版
Polya定理+欧拉函数优化
Polya定理+欧拉函数优化 + 逆元
Polya定理+欧拉函数优化 + 逆元
Polya定理+模拟24种旋转
Polya定理+模拟24种旋转
Polya定理+结合方形旋转和环形旋转
Burnside引理+动态规划+矩阵优化
Burnside引理+动态规划+矩阵优化
SCU 2658 The Queen's New Necklaces
Burnside引理+多重集排列
Burnside引理+多重集排列
Burnside引理+动态规划+散列哈希
Burnside引理+状态压缩
HDU 5495 LCS
题意:给定两个序列 {A1,A2,...,An} and {B1,B2,...,Bn}. 每个序列都是 {1,2,...,n}的排列。求另一个排列 {p1,p2,...,pn} 满足 {Ap1,Ap2,...,Apn} and {Bp1,Bp2,...,Bpn}的最长公共子序列最长。
题意:利用置换群求循环节的方法,将每个元素分组,每个组中的元素可以进行重新排列。每一组的放在相邻的位置,那么容易得知,如果这个循环节长度为1,则可以贡献1的长度;如果循环节的长度L>1,则可以最多可贡献L-1的长度。累加这些长度即可。
图7
HDU 1812 Count the Tetris
题意:给N×N的棋盘染上C种颜色(N,C<31),棋盘旋转和反射后一致则认为是同一种,问总共多少种染色方案。
题解:Polya定理+大数。
题目要求翻转和反射,也就是总共8种情况:旋转0度、90度、180度、270度、垂直翻转、水平翻转、主对角线翻转、次对角线翻转,所以|G| = 8。
图8
计算每种情况下的循环节,即Ci,然后套入Polya公式即可。举个例子,垂直翻转的情况如下,所以循环节为2。
图9
PKU 2409 Let it Bead
题意:给定一个由n个珠子组成的项链,穿成环状,每个珠子有m种颜色。问总共有多少种项链,项链旋转或翻转算成一种。
题解:Polya定理。由数据看,这题光旋转是不够的,还有翻转的情况(如果只算旋转,2 6 的情况应该是14)。那么这题的|G| = 2n,Ci可以通过序列左移(或右移)模拟求循环节。
图10
PKU 1286 Necklace of Beads
同PKU 2409。
PKU 2154 Color
题意:给定一个由n个珠子组成的项链,穿成环状,每个珠子有n种颜色(n <= 10^9)。问总共有多少种项链,项链旋转后相同算成一种。由于数据量巨大,只需要输出最后的结果模P。
题解:Polya定理+欧拉函数优化。
由于n比较大,模拟项链旋转算循环节的方法不再适用,但是环形旋转得到的循环节是有规律的。长度为n的环状结构旋转i格后当前置换的循环节个数为gcd(n, i),每个循环长度为n/gcd(n,i)。如图11展示的长度为6的6种置换各自的循环节:
图11
根据Polya计数定理可得,问题所求的解为:
图12由于N为10^9,直接枚举i必然超时,所以需要用数论优化。考虑小于N且和N的最大公约数为K的数满足N mod K = 0,即K为N的约数。那么假如K已知,则gcd(N, i) = K,进而可知gcd(N/K, i/K)=1,那么我们想要求满足该条件的i的个数,就是要求小于等于gcd(N/K)且和它互素的数的个数,也就N/K的欧拉函数。
于是我们可以通过枚举N的因子K,然后计算N/K的欧拉函数,然后将所有分量求和,公式如下:
图13枚举所有小于等于根号N的因子K,那么如果N/K > K,则N/K是另一个比K大的因子,也需要做相同处理。这题需要注意的一点就是海量数据,所以每次枚举一个因子然后计算欧拉函数会导致超时,所以这里还需要优化。
我们可以采用递归的方式枚举因子,这样做的好处就是因式分解N以后,可以同时在常数时间内计算N的因子K和(N/K)对应的欧拉函数。
HDU 2239 机器人的项链
题意:给定一个由N个珠子组成的项链,穿成环状,每个珠子有M种颜色(N <= 10^9, M<=100)。问总共有多少种项链,项链旋转算成一种。由于数据量巨大,只需要输出最后的结果模9937。
题解:Polya定理+欧拉函数优化。
大致和PKU 2154一致,有几点不同。珠子颜色M有可能等于0,M=0时直接输出0。还有就是这题中的珠子颜色M和项链长度N不相等,如图所示,公式中分母N无法约去。
图14考虑P=9937是个固定的数,所以我们可以先将分子模P的值求出来,令这个值为S,真正的值就是S + kP (k为非负整数),那么原式可以表示如下:
图15等式两边同时乘上N,得到如下等式:
图16其中N、P、S均为已知数,L为未知数,于是直接枚举L(0<=L<9937)判可行即可。
HDU 3923 Invoker
题意:给定一个由n个珠子组成的项链,穿成环状,每个珠子有m种颜色(n, m<=10000)。问总共有多少种项链,项链旋转或翻转算成一种。由于数据量巨大,只需要输出最后的结果模1000000007 。
题解:Polya定理+欧拉函数优化+逆元。
这题有两种情况:旋转和翻转。分别用Polya计数定理处理,公式如下:
图17其中f(m,n)代表旋转部分方案数,g(m,n)代表翻转部分的方案数。旋转可以采用PKU 2154的方式利用欧拉函数进行优化,翻转部分稍后讨论。最后除法求2n逆元时由于模数太大,不能采用枚举,我们首先容易求出:
图18那么原式可以转化为:
图19其中k为任意整数,原等式两边同时乘上2n,得到
图20L为未知数,n为珠子个数,P是模数即1000000007,S是Polya定理求出来的分子已知。求的就是L,这就是一个同余方程,因为n < P且P是一个大素数,所以必然有gcd(2*n,P)=1,于是该方程必然有解,利用扩展欧几里得求解L的最小非负整数解就是答案。这里的L就是2n在模P上的逆元。
再来讨论翻转的方案数,翻转比较简单,有规律可循,如图所示:
图21当n为奇数时,所有置换的循环节均为(n+1)/2;当n为偶数时,循环节为n/2和n/2+1的各有n/2个。所以代入Polya计数定理,有翻转的方案数为:
图22当n为奇数时没有分数;当n为偶数的时候,分母2可以直接约去。
HDU 3547 DIY Cube
题意:用C(C <= 10^9)种颜色给一个立方体的8个顶点染色,求方案数(旋转一致算相同)。
题解:模拟旋转后用Ploya定理求解。
图23如图所示,先将所有顶点编号,那么可以得出如果将某个点固定在原点,则可以绕着(1,1,1)这条轴旋转0度、120度、240度三种情况,所以所有旋转数就是8×3=24。那么我们写好一个旋转函数,其它的固定原点的直接手写模拟8种初始情况,然后分别用旋转函数生成其他16种情况即可。
每种情况模拟求出循环节,然后利用Polya计数累加和即可。
图24从图中得知,④和⑤无论怎么旋转都不动,①⑥⑦互相交替变换,②③⑧互相交替变换。
所以对(①②③④⑤⑥⑦⑧)这种编码方式,旋转0度的置换表示为(1)(2)(3)(4)(5)(6)(7)(8),旋转120度的置换表示为(5)(4)(167)(238),旋转240度的置换表示为(5)(4)(167)(238)。置换循环节长度分别为8、4、4。
然后分别列出其它七个点为原点的编码方式,再进行相应旋转求出循环节,套用Polya定理即可。
UVA 10733 The Colored Cubes
题意:用C(C<=1000)种颜色给立方体的每个面染色,求本质不同的方案数(即不能通过旋转获得)。
题解:模拟旋转后用Polya定理求解。
可以给每个面编号①②③④⑤⑥,然后将每个面放在x-y平面后,记录下所有面的相对关系,总共6种。因为我们知道立方体的旋转有24种,所以其它18种可以通过绕某个固定的坐标轴旋转0度、90度、180度、270度得出。
将24种旋转置换求出循环节,直接套用Polya定理即可,方案数在long long范围内。
HDU 3441 Rotation
题意:给定A*A个方块,找到所有满足B*B*K+1=A*A(K>=0)的B,将每个B*B的方形串起来,然后中间用剩下的那块和所有B*B块连接。方块的“自转”和“公转”后状态一致则认为是同一种方案,问有多少种方案数。数据量巨大,所以最后答案只需要模P,P = 1000000007。
题解:Polya定理+欧拉函数+因子加减法。
n*n的方形旋转总共四种置换:0度、90度、180度、270度。当n为奇数时,方案数如下:
图25
图中那些相同颜色的位置代表经过该种置换后仍然属于同一个循环的位置,那么可以通过一圈一圈得扩大进行递推。同理得出偶数的情况:
图26第一步分解A+1和A-1的素因子并且进行素因子合并,然后利用递归枚举素因子的形式枚举所有A*A-1的因子B*B,对于每个B计算B*B方格对应的方案数(四种置换套上Polya定理),然后得到K以及K的素因子分解,即K个B*B的方块进行旋转,套用环形Polya的gcd公式进行下一步计算,环形的情况最后需要乘上C,代表中间的那个可以有C种颜色。
然后就是要注意各种细节,首先A=1的情况直接输出C即可;然后由于K = (A*A-1)/B/B,所以K可能会超过int32,这里分解K的素因子就会悲剧,所以分解K的素因子的时候,比较好的做法就是首先分解A+1和A-1、以及B的素因子,然后将A+1和A-1的素因子合并再减去两倍的B的素因子,就得到了K的素因子。
PKU 2888 Magic Bracelet(强烈推荐)
题意:由n(n <= 10^9)个珠子组成的项链,每个珠子共有m(m <= 10)种颜色,再给定k组限制(a, b)表示颜色a和颜色b的珠子不能相邻,问总共有多少种方案满足长度为n的项链。输出最后的答案模9973。
题解:Burnside引理 + 矩阵优化 + 欧拉函数 + 逆元。
(没做这题之前,没有理解Burnside引理的含义,之前都是套Polya计数公式,导致这题完全懵逼,想了好久,不过想到了其实很简单,所以强烈推荐这题)。
首先,一条n个珠子的项链旋转i格的置换群循环节长度为gcd(n,i)。我们来看一条长度为8的项链,旋转4格后的情况:
图27表示成置换群乘积的形式为(15)(24)(36)(48)。
Burnside引理的核心是,对于每种置换gi,我们需要求出|D(gi)| (|D(gi)|代表在gi这种置换作用下没有改变状态的方案个数),然后计算他们的平均值。
那么在gi=<旋转4格>的情况下,要让该置换作用后状态不改变,只有15用同一种颜色,26用同一种颜色,37用同一种颜色,48用同一种颜色(同一个置换中的元素用同一种颜色)。于是,令x = gcd(n,i),问题转化成求前x个珠子颜色的合法方案数。
显然,如果没有相邻珠子颜色的限制,每个珠子都能取遍m种颜色,方案数就是m^x。没错,这就是Polya定理!!!
图28前x个珠子颜色的合法方案数。“合法”的含义是:任意两个相邻珠子不在限制条件内,并且第1个和最后1个也不在限制条件内。那么我们建立一个可达矩阵A,A[i][j]=1代表第i种颜色和第j种颜色能够相邻(直接用输入数据取反得出),反之A[i][j]=0。
图29图29的矩阵代表输入数据为(1, 1)(2, 2)(2, 3)的情况。
这个问题转变成:通过这个邻接矩阵A,从i出发(0 <=i<m)经过x步回到i的方案数。直接求矩阵A的x次B (B=A^x),然后累加B[i][i] (0<=i<m)就是答案了。矩阵的次幂采用二分优化即可。
由于n比较大,所以采用欧拉函数进行优化,最后求出所有的方案累加,由于Burnside引理的结果还要除上n,所以最后的结果需要乘上n相对于9973的逆元,用扩展欧几里得求逆元即可。
取模的时候需要注意,这题的算法瓶颈在于矩阵乘法,所以在矩阵相乘时,能不取模先忍着,我们知道9973*9973*10<2^31,所以矩阵乘法(O(m^3))的最内层循环可以不进行取模,在最后所有项都相加完毕后再取模效率会高出不少。
HDU 2865 Birthday Toy
题意:由n(n <= 10^9)个珠子组成的玩具,每个珠子和中心连接一个大珠子,所有珠子共有m(m<=10^9)种颜色,颜色相同的珠子不能相邻,问总共有多少种方案满足长度为n的项链。输出最后的答案模1000000007。
题解:Burnside引理 + 矩阵优化 + 欧拉函数 + 逆元。
首先,因为颜色相同的珠子不能相邻,中间的珠子和所有珠子都相邻,所以中间的珠子占用一种颜色后,其它的珠子相当于少了一种颜色。
剩下的就是PKU 2888的一种特殊情况,颜色相同的珠子不能相邻,于是我们参考PKU 2888的算法,唯一不同的就是这个可达矩阵是已知的,不依赖于输入数据,它一定是一个除了主对角线是0其它均为1的“反单位矩阵“,如图30所示,表示的是4种颜色的情况下的可达矩阵:
图30令颜色种数为color,矩阵B=A^x,那么B[i][i]即从i(0<=i<color)这种颜色出发,经过x颗珠子回到自身的方案数。但是这个矩阵太大,无法进行矩阵二分。
由于这个矩阵的特殊性,我们发现无论乘多少次,这个矩阵永远只有两种值:主对角线的值和非主对角线的值。令A^x的主对角线的值为F(x),非主对角线的值为G(x),那么A^(x-1)和A^x表示如下:
图31因为我们的目标是要求出F(x),于是配上如下这个恒等式,得到了F(x)和G(x)的递推关系。
图32图33
两个函数互相嵌套,相辅相成。这可怎么办?我们可以将其中一个带入另一个,如图所示,化成G(x)的递推式,这样可以将G(x-1)求出来,然后乘上color-1自然就是F(x)。
图34G(x)这个递推式就很熟悉了,直接用矩阵二分来求就行了。求出G(x-1),那么F(x)=(color-1)G(x-1)。
图35
SCU 2658 The Queen's New Necklaces
题意:给定M(M<=100)种颜色,以及每种颜色的珠子个数a[i],求串成一个项链。问有多少种本质相同的方案(旋转后一样的算成同一种方案)。
题解:Burnside引理 + 多重集排列。
这题又是一个新的里程碑。
多重集排列的概念如下:n个元素,a1重复了n1次,a2重复了n2次,····,ak重复了nk次,且n1+n2+····+nk=n。这样n个元素进行全排列,可得不同排列的个数如下:
图36令珠子总数为n,根据Burnside引理,枚举每一种置换,对于第i种置换(循环左移i格),它的循环节为gcd(n,i),且每n/gcd(n,i)个珠子为一组,我们现在要计算在这种置换的作用下不改变状态的种类数,则每一组中的珠子颜色必须保持一致。所以问题转化成求前gcd(n,i)个元素的多重集排列。
对于一个固定的g=n/gcd(n,i),每一种颜色的珠子必须是g的倍数,否则无法完成该置换下不改变状态这个需求。然后就是求集合{ a[i]/g | i<m}的多重集排列了,这里需要用到大数乘除法。将所有置换下的多重集排列加和再除上n就是最后的答案了。
举个例子,循环左移4格置换表示如下,它的循环节为4,每个循环内珠子的个数为2,即(15)(26)(37)(48)各自同色。那么我们只需要将a[i]分成2组,一组分配给(1234),一组分配给(5678)。而且两者分配的时候顺序要保持完全一致,所以只需要考虑将{a[i]/2 | i<m}分配给(1234)的情况。这就转化成了4个元素的多重集全排列问题了。
图37
UVA 11255 Necklace
题意:给定3种颜色的珠子的个数a、b、c,求串成一个环形后本质相同的方案(旋转、翻转相同算同一种)。
题解:Burnside引理 + 多重集排列。
还是运用多重集排列,这题不需要用到大数,我们可以将多重集排列的公式做一个转化:
图38旋转:参考SCU 2658。
翻转:需要对n分奇偶性处理:
n为奇数,对于任意一种置换,必然是一个元素落单,其它两个元素两两配对。如图39所示:
图39那么我们可以枚举这个落单的元素分别为那种颜色(一共3种情况,分别统计),然后再按照旋转的情况来处理剩下的元素。最后记得将种类数乘上n,因为翻转有n种置换。
n为偶数,需要分情况,要么都是两个元素的循环,要么会有正好两个落单。对于第一种情况可以参考旋转的情况用多重集排列处理掉,总共n/2种置换;对于两个落单的情况,分别枚举这两个落单的元素是什么(3×3=9种情况,分别统计),然后再按旋转的情况来处理剩下的元素,也是n/2种置换。
图40最后,将旋转和翻转的情况加和除上2n就是最后的答案。
UVA 10601 Cubes
题意:给定12根等长的木棒的颜色(颜色范围1-6),求组成一个立方体,问本质不同的立方体数目(如果两个立方体可以通过旋转后变成一样的则为本质相同的立方体;否则为本质不同的)。
题解:Burnside引理 + 动态规划(记忆化搜索)+散列哈希。
首先将立方体的每条边进行编码,顶面四条边(红色)为1234,底面四条边(蓝色)为5678,垂直的四条边(绿色)为9101112。那么将任意边和y轴重合,最多衍生出两种状态,也就是总的置换数为:边数×状态数=12×2=24。
图41将每种置换枚举出来,然后利用动态规划计算将给定的颜色放入这些边的方案数。
例如某一种置换为(1 10)(2)(3 9)(4 6)(5 11)(7 12)(8),根据Burnside引理,同一个置换内的颜色必须相同,但是这题不像SCU 2658那样每个置换有固定的规律,考虑到数据量很小,所以我们可以直接枚举每个置换对应的颜色,具体可以这么做:
用dp[x][a][b][c][d][e][f]这个7维数组来表示状态,它表示的是剩下的x个置换用a种1号色、b种2号色、...f种6号色染完的合法方案数。然后直接枚举每个置换对应的颜色,进行记忆化搜索即可。
当然,以上的状态表示只是理想状态下的,实际上这是不可编码的,我们可以将(a,b,c,d,e,f)压成一个整数T,然后利用散列哈希将T映射到一个下标y中,再用dp[x][y]来表示状态,这样就简单多了。
最后将所有置换下的解加和再除上置换数24,就是最后的答案了。
HDU 3091 Necklace
题意:给定N(N <=18)个珠子和任意M(M<=N*N)对关系(a,b)表示a、b两个珠子能否连接,求组成项链的方案数。
题解:Burnside引理+记忆化搜索
首先,N=1的情况需要分情况讨论,1号和1号能连接输出1,否则输出0;
然后就是要猜题意。按照样例输出2,所以可以得知,旋转相同要排除,并且翻转相同不能排除。由于每个珠子的颜色均不相同,那么根据Burnside引理,考虑N种置换,只有0置换有解,那么可以枚举每个珠子作为起点,用dp[i][j]表示最后一个珠子为i,珠子组合为j的方案总数,然后用记忆化搜索求解,求出来的解除上N就是答案。
然后我们发现无论以哪个点为起点,情况都是一样的,于是可以固定1号珠子作为起点计算总方案数,这样最后就不需要除上N了。
标签:置换,旋转,珠子,Polya,引理,Burnside 来源: https://blog.51cto.com/u_15239535/2849759