Polya计数 学习笔记

版权声明:写得不好,转载请通知一声,还请注明出处,感激不尽 https://blog.csdn.net/As_A_Kid/article/details/82217221

置换

基本概念

置换是相对与群(当然我们讨论的是有限群= =)而言的一种操作。

通常我们这样来表示

( 1 2 3 n a 1 a 2 a 3 a n )

它的意义是对于新的排列,编号 a i 的元素将被编号 i 的元素所取代(不是位置)。其中a仍然是个排列,也就是保证了一一对应。

通俗地来说吧,置换就是一种特定的变换操作。

乘法

置换也可以相乘,其意义是把两个置换的影响直接合成一种置换操作。

循环

我们称关于n个元素的旋转置换操作为循环。那么我们会发现任何一个置换都可以由一个或多个互不相交的循环操作相乘得到。这些循环的阶数是小于等于原置换的。

怎么证明?因为置换是满足一一对应的,那么如果我们把 i a i 连边,则可以得到一个或多个环,每个环对应着一个相应阶数的循环。

Burnside引理

给出了多种判定两方案本质相同的置换方案。用 L 表示本质不同的方案数,用 | G | 表示置换方案数, D ( a i ) 表示在置换 a i 下不发生改变的方案数。那么就有了这么个结论。丢下结论就跑

L = 1 | G | D ( a i )

Polya定理

但是我们会发现 D ( a i ) 是难以计算的,因为如果我们用朴素的搜索来统计,时间复杂度是答案级别的。我们当然希望能优化它。(你问我|G|怎么算?用手算)

假设我们现在考虑的置换方案如下,把它拆成循环乘积的形式,得到了3个循环,即它的循环节数为3。我们可以用 c ( a ) 来表示置换方案a的循环节数。

( 1 2 3 4 5 3 5 1 4 2 ) = ( 13 ) ( 25 ) ( 4 )

如果某方案在此置换下不变,就只需要把同一个循环中的元素搞的一样即可。对于一类经典问题,即染色问题,对于n个珠子,染m种颜色,旋转判定同构。

则有 L = 1 n m c ( a i )

例题

poj2154

题意:

用n种颜色染n个珠子,旋转判定同构,问有多少种方案?答案对p取模。

题解:

我们有n种置换方案,不妨记旋转i下为置换i。那么置换i的循环长度应该是 n g c d ( n , i ) ,相应的循环节数为 g c d ( n , i )

L = 1 n i = 1 n n g c d ( n , i )

套用莫比乌斯反演的套路优化之。
L = d | n ϕ ( n d ) n d 1

时间复杂度 O ( n )

uva10601

题意:

立方体的计数问题,给出12条边的颜色。

题解:

我们来大力分类讨论一下:

  • 不转:12组1条棱一循环。
  • 转轴为对面中心连线:3种情况,有3种置换方案(90/180/270)。其中90和270是3组4条棱一循环。180是6组2条棱一循环。
  • 转轴为对棱中心连线:6种情况,1种置换方案(180)。5组2条棱一循环,2组1条棱一循环,因为选取的两条对棱要特殊考虑。
  • 转轴为对顶点:4种情况,2种置换方案(120/240)。4组3条棱一循环。

注意这个其实是有染色个数限制的,那么计数时就需要用到组合数。

poj2888

题解戳我

猜你喜欢

转载自blog.csdn.net/As_A_Kid/article/details/82217221