polya定理概述.docx
- 文档编号:29477354
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:11
- 大小:35.13KB
polya定理概述.docx
《polya定理概述.docx》由会员分享,可在线阅读,更多相关《polya定理概述.docx(11页珍藏版)》请在冰豆网上搜索。
polya定理概述
Polya定理
置换:
1,2,3,……,n
P[1],P[2],P[3],……,P[n]
有一个序列,原来是1,2,3,……,n,现在用P[1]来代替1,用P[2]来代替2,用P[3]来代替3,……,用P[n]来代替n,那么我们就称P为原序列的一个置换。
循环:
1,2,3,……,n-1,n
2,3,4,……,n,1
有一个序列,原来是1,2,3,……,n,现在用2来代替1,用3来代替2,用4来代替3,……,用n来代替n-1,用1来代替n,那么我们就称(1,2,3,……,n)为原序列的一个循环。
任意一个置换都可以划分为若干个循环的共同作用效果。
例如:
置换P[3,5,1,2,4],我们可以用(1,3)(2,5,4)这两个循环来表示这一个置换(原序列为1,2,3,4,5)。
置换P[5,2,4,6,1,3],我们可以用(1,5)
(2)(3,4,6)这三个循环来表示这一个置换(原序列为1,2,3,4,5,6)。
通过上面两个例子,我们可以感受到了,可以使用若干个循环来表示一个置换。
当我们知道一个置换P的时候,我们可以用O(n)的时间来找出它的循环,具体算法就是线性扫描,并对扫描过的进行标记,最终可以求出循环数和每个循环的大小。
重要定理:
n个序列,m个置换中,对于每一个序列,置换不动数*同类数=总置换数。
其中,给出以上名词的定义:
置换不动数:
在m个置换中,存在k个置换,使得这个序列通过任一个置换都保持序列相等,那么k就是置换不动数。
同类数:
在n个序列中,存在k个序列,使得这个序列可以通过m个置换中的任一个置换到达,那么k就是同类数。
总置换数:
就是m。
证明:
设置换不动数为x,同类数为y,总置换数为z。
对于一个序列A,我们知道,有x个置换可以使得A*P=A(其中P∈这x个置换)。
那么,设有两个置换M和N,满足A*M=A*N≠A,可以得到A*M/N=A,可见(M/N)∈这x个置换,也就是M∈(N*这x个置换),即对于任意一个置换P,则有x个置换与它等价(包括自己),又因为有y个同类数,所以x*y=z,定理得证。
注意事项:
序列虽然是1,2,3,……,n,但是序列的第1个格子、第2个格子、第3个格子、……、第n个格子,它们格子里面的值不一定是1,2,3,……,n,可以是任意数字。
判断两个序列是否相等的标准,就是判断每一个对应的格子的内容是否都相等。
(通俗点来讲就是对格子涂色)
Burnside定理:
用若干种颜色对一个序列进行染色,那么在m个置换中,C(i)表示在第i个置换下不动的序列数,则有ans=(Σ(C(i)))/m,其中ans为等价类数目(两个序列A和B,如果A通过某一个置换可以到达B,那么A和B属于同一个等价类)
证明:
设总共有L个等价类,总置换数为m,第i个等价类的置换不动数为Xi,同类数为Yi,那么Σ(C(i))(1<=i<=m)=Σ(Xi*Yi)(1<=i<=L)=Σ(m)(1<=i<=L)=L*m,那么L=(Σ(C(i)))/m,定理得证。
(等式转化中用到了重要定理)
证明技巧:
令t=Σ(C(i)),那么我们在求t的时候,这种方法就是对于所有的置换分别求出不动数再求和,然而第二种方法就是对于所有的序列分别求出置换不动数再求和,证明的时候利用这两种方法结合即可。
Polya定理:
用k种颜色给n个格子染色,对于一个置换P,如果它有m个循环,那么C(P)=km。
证明:
一个置换P,如果它有m个循环,通过这个置换不动的序列,必然满足一个条件,就是在序列中的同一个循环的格子的颜色相同,有k种颜色,m个循环,那么C(P)=km。
【例一】:
SGU294
有一个长度为N的环,上面写着’X’和’E’,问本质不同的环有多少种。
(N不超过200000,两个本质不同的环不可以通过旋转而互相得到)。
【分析】:
用2种颜色,给N个格子染色,其中有N个置换(这N个置换分别为:
不变,向左移1格,向左移2格,向左移3格,……,向左移N-1格)。
总共最多有2N种环,也就是有60000多位数,就算用一万进制优化,也有15000多位数。
最直接的方法:
依次求出N个置换的循环数,然后运用polya定理求出等价类个数,这样的复杂度为O(N2*数字位数)。
第一个优化:
不难发现,向左移动x格,那么这个置换的循环数就是GCD(N,x),如果不变则视为向左移动N格,具体证明可以按照分组的原理证明就可以了。
这样的时间复杂度为O(N*数字位数),还是过不了。
第二个优化:
仔细观察我们计算的方式,居然是依次求N个置换的循环数,这样的话白白浪费了大量运算。
我们可以实现预处理出GCD为1的有多少个、GCD为2的有多少个、GCD为3的有多少个、……、GCD为N的有多少个,然后对于GCD相同的只计算一次,这样就可以避免重复计算,时间复杂度为O(因数个数*数字位数),可以通过。
【例二】:
UVA10601
要求把正方体的12条棱染色,并且每种颜色的个数给定,求总方案数(旋转后相同的方案算一种)。
【分析】:
一个正方体,有各种各样的旋转方法,空间想象能力差的人就吃亏了。
但是如果分类好的话,谁都可以做出这道题目。
我们首先给这个正方体的六个面编个号,分别是1、2、3、4、5、6,其中1与6是相对的,2与5是相对的,3与4是相对的(就是一个骰子而已)。
然后我们可以分6种情况:
1在正上方,6在正下方。
6在正上方,1在正下方。
2在正上方,5在正下方。
5在正上方,2在正下方。
3在正上方,4在正下方。
4在正上方,3在正下方。
这六种情况都可以有4种旋转方法:
首先俯视这个正方体,然后顺时针旋转0°、90°、180°、270°。
这就是4种方法了。
综上所述,分6种情况,每种情况有4种方法,所以旋转方法有6*4=24种。
这道题目分析到这里,可以说已经完成了80%了。
接下来的任务就是找出这24个置换(如果想要方便点的话,可以先打表打出(1,6)、(2,5)、(3,4)这三种情况的置换,然后上下颠倒和顺时针旋转都用通式来表示出来)。
因为颜色数有限制,所以我们可以使用状态压缩动态规划,用f[a1][a2][a3][a4][a5][a6]来表示第1种颜色使用了a1次、第2种颜色使用了a2次、第3种颜色使用了a3次、第4种颜色使用了a4次、第5种颜色使用了a5次、第6种颜色使用了a6次的方案总数。
然后分别求出24个置换的方案总数,除以24就是答案了(Burnside定理),总的状态数为O(126)。
(其实没有这么多的)
【例三】:
SPOJ419SPOJ422
给你一个2a2b的矩阵,在内存中的存放方式是先存第一行的,再存第二行的……每行也是从左到右存放。
现在你想求它的转置矩阵(也是一样的储存方式),但是只能用交换操作,问需要交换多少步。
SPOJ419有100组输入数据
SPOJ422有400000组输入数据
【分析】:
举个例子来说明题意:
设a=1,b=2:
原矩阵:
0123
4567
原矩阵内存:
0、1、2、3、4、5、6、7
转置矩阵:
04
15
26
37
转置矩阵内存:
0、4、1、5、2、6、3、7
相当于一个置换P[0,4,1,5,2,6,3,7],显然这个置换可以表示成(0)(1,4,2)(3,5,6)(7),有4个循环,答案为21+2-4=4,即交换次数为4。
假设置换中有k个循环,那么交换次数为2a+b-k,因为交换只存在于每个循环之中,并且在一个大小为x的循环中需要交换x-1次。
在上面这个例子中:
6从原矩阵中的(1,2)到达转置矩阵中的(2,1),从原矩阵中的地址22*1+2到达转置矩阵中的地址21*2+1。
一半来说,从2a*2b的(x,y)到达2b*2a的(y,x)的时候,地址从2bx+y到达2ay+x,把这两个地址写成二进制数,就相当于下图:
那么每次转换位置的时候就相当于把地址循环向左移动a位(越界的拉到最右边去),那么一个地址经过移动若干次肯定会回到它自己本身,这就是循环。
这些循环的大小应该就是(a+b)/GCD(a+b,a),因为(a+b)/GCD(a+b,a)*a=LCM(a+b,a),并且LCM(a+b,a)mod(a+b)一定等于0,所以具有以上性质。
我们令L=(a+b)/GCD(a+b,a),当a=1的时候就是【例一】了,当a≠1的时候,我们令T=GCD(a+b,a),把一个置换中的a+b个内容划分为若干组,其中每组的大小为T,在同一组中,显然方案数为2T,划分完毕之后,就相当于把每一个置换的总长度变为L(因为(a+b)/T),也就把问题转化为a=1的情况了。
设每一个置换的长度为L,若一个置换为循环向左移动i位(不动视为向左移动L位),那么我们就在GCD(L,i)上累加一下,把GCD相同的统一计算,再运用Polya定理和Burnside定理可以求出等价类个数,即最初问题的循环个数k,最后求出答案2a+b-k,即最少交换次数。
下面我们来仔细分析一下具体过程:
①:
预处理出1到106中的每一个数是否质数以及每一个数的其中一个质因子。
②:
对L进行质因数分解(L也就是(a+b)/GCD(a+b,a)),相同的质因子只存一个。
然后先初始队列队列令f[1]=L,对于队列上的一个数i,我们枚举一个质因子j,令Δ=f[i]/j,那么我们就让f[i]=f[i]-Δ,f[i*j]=f[i*j]+Δ(注意如果i*j大于L就放弃),并且不重复地扩展队列,那么扩展次数就是L的因数个数了。
(其实f[i]就是GCD为i的个数)
③:
枚举②中队列的每一个数,对于GCD为i的,我们累加2i*f[i],最后得到的结果除以L,就是最初问题的循环个数k,最后求出答案2a+b-k,即最少交换次数。
对②分配方式的证明:
首先当前队列上的数为i,那么枚举到第一个质因子j时,我们把f[i]分配给f[i*j]的时候应该分配得相对较多,因为它包括了GCD是i*j的倍数的情况,所以我们应该让先分配的优先扩展队列,这样才能避免重复分配,这样的话就可以保证分配的正确性,因为GCD为它本身的倍数的可以成功扩展出去。
综上所述,我们可以得到一个时间复杂度为O(cases*α(a+b))的算法。
(其中α(x)为x的因数个数)
经验总结:
这一题中题目已经很清楚地写出了2x这个关键字眼,就应该想到需要把地址拆成二进制写出来,然后对二进制数进行分组,不难发现转置操作就是循环左移a位。
后面的优化手段也只是常见做法而已,关键的是要把问题转化为polya模型。
【例四】:
SGU282
染色图是无向完全图,且每条边可被染成M种颜色中的一种。
两个染色图是同构的,当且仅当可以改变一个图的顶点的编号,使得两个染色图完全相同。
问N个顶点,M种颜色,本质不同(两两互不同构)的染色图个数(模质数P)。
(1<=N<=53,1<=M<=1000,N
【分析】:
这道题目说改变顶点的编号视为同构,那么我们就可以想到点的置换,枚举点的置换并求出它所导致的边的置换,求平均数即为答案。
但是点的置换有N!
这么多,所以我们只好避免重复计算,把具有相同特征的置换统一计算。
我们把置换用最小表示法表示出来,A1+A2+……+AL=N,其中L为这个置换的循环数,Ai表示第i个循环的大小,并且0<A1≤A2≤……≤AL。
按道理来讲这种划分方法的数量应该很少的,并且事实上它也只有三十多万而已。
对于一个{Ai},我们可以计算出有多少个置换的最小表示法是它。
显然选出来的方案数首先是C(N,A1)*C(N-A1,A2)*……*C(AL,AL),那么就是N!
/(A1!
A2!
……AL!
)。
但是因为相同的值无论先后取都是一样的,所以有重复,那么答案又应该是N!
/(A1!
A2!
……AL!
B1!
B2!
……BT!
),但是对于一个Ai,选完之后还与顺序有关(因为选点的顺序不同置换就不同了),所以最终的答案应该是N!
/(A1A2……ALB1!
B2!
……BT!
)。
现在已经处理好点的置换了,就来分析一下点的置换引起边的置换的关系。
①:
对于任意两个点,分别为i和j,它们同时属于一个Ak,那么所有边(i,j)可以组成[Ak/2]个循环。
②:
对于任意两个点,分别为i和j,它们分属Am和An,那么所有边(i,j)可以组成GCD(Am,An)个循环。
根据上面两个关系,我们可以求出点的置换所引起的边的置换的循环总数,然后运用polya定理求解即可,时间复杂度为O(F(N)*N2)。
(其中F(N)为N的最小表示法数量)
①证明:
对于任意两个点,分别为i和j(i<j),它们同时属于一个Ak,那么边(i,j)将会成为(imodAk+1,jmodAk+1),又因为min(|i-j|,Ak-|i-j|)≤[Ak/2],所以所有边可以组成[Ak/2]个循环。
②证明:
对于任意两个点,分别为i和j,它们分属Am和An,那么边(i,j)将会将会成为(imodAm+1,jmodAn+1),并且循环的大小为LCM(Am,An),总个数为Am*An,所以循环个数为Am*An/LCM(Am,An),即GCD(Am,An)。
这个问题解决的关键是找出相同特征的置换并统一只计算一次,这种思想在很多地方都很有用,它的作用就是能大大减少重复计算次数,提高程序效率。
同时做一些数学题的时候应该多猜想,
找出尽可能多的有用的性质来帮助解题,时间允许的话可以适当证明一下。
【例五】:
POJ1286
用3种颜色给n(n<24)个点染色,其中旋转和翻转均被视为相同种类,问种类个数。
【分析】:
这道题应该是很简单的。
用3种颜色给n个点染色,旋转的话置换则有[1,2,……,n]、[2,……,n,1]、……、[n,1,……,n-1],翻转的话则有[n,n-1,……,1]、[n-1,……,1,n]、……、[1,n,……,2],总共有2n个置换,直接把每一个置换枚举出来再用polya定理求解即可,时间复杂度为O(n2),其实这题还可以运用【例一】和【例三】中的思想进行优化,做到O(n)。
【例六】:
POJ2154
有3500组数据,每组数据给出n(1≤n≤109)和p(1≤p≤30000),要求用n种颜色给n个点染色(不必用完n种颜色),旋转则视为同一种方案,问方案数模p。
【分析】:
最简单的方法就是求出n个置换(左移1次、左移2次、……、左移n次),然后求平均数,这样的时间复杂度为O(3500*n),不大实际。
我们可以运用【例三】中的方法进行优化,只对n的因数进行求解,因为因数个数很少,我们可以求出每一个因数有多少次成为GCD。
在此之前,我们必须对n进行质因数分解,时间复杂度为O(n0.5),所以总的时间复杂度为O(3500*n0.5)。
这道题必须注意的是方案数模p(p不一定与n互质),我们如果求完总数再除以n的话就有麻烦了。
但是我们发现,它是用n种颜色染色的,所以我们在使用polya定理求解的时候,假设一个置换有k个循环,本来应该累加nk的,现在只需要累加nk-1即可,因为这样就等价于除以n了,但是却避免了除法。
【例七】:
POJ2888(个人感觉这题不错)
多组数据,给出n(1≤n≤109)个点和m(1≤m≤10)种颜色还有k(0≤k≤C(m,2))个限制,就是用m种颜色给n个点染色(不必用完m种颜色),这n个点组成一个环,有k个限制,第i个限制包括两个数Ai和Bi,表示Ai和Bi这两种颜色不可以相邻。
并且这个环旋转产生的新方案被视为同一种,现在要求满足这k个限制的方案数。
【分析】:
点数这么多,并且还多组数据,普通的方法一定不行,因为n个置换实在难受,所以我们只好另寻思路。
对于n个置换(左移1次、左移2次、……、左移n次),就算使用【例三】的优化方法,我们也不能满足k个限制,所以【例三】这种强大的优化方法也无能为力。
置换数太多,让我们无法使用polya定理,应该用其它方法和Burnside定理结合起来解题,这样才能求出方案数。
考虑到有限制条件,我们可以使用DP。
首先枚举第一个点的颜色,再用f[i][j]来表示当前处理到了第i个点,并且这个点的颜色为j的方案数,最后在f[n]中求出与第一个点的颜色匹配的方案数和。
考虑到每一阶段转移的方式都是不变的,并且n很大,m很小,所以我们可以使用矩阵乘法加速转移。
一个置换可以划分为x个循环,那么我们就用x来代替n做上面的矩阵乘法就可以了,因为循环是必须同色的,并且只有相邻循环会涉及到题目的限制,和逐个逐个点是一样的。
所以总的时间复杂度为O(F(n)*m3*log2n)。
(其中F(n)为n的因数个数)
题目就这么多了,再多的题目也是类似的方法处理,万变不离其宗,关键的是使用好两个定理,避免重复计算,找出题目中各种各样的性质,再用强大的方法优化,这样就对解题有很大的帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- polya 定理 概述