1. 程式人生 > >Polya計數 學習筆記

Polya計數 學習筆記

置換

基本概念

置換是相對與群(當然我們討論的是有限群= =)而言的一種操作。

通常我們這樣來表示

(123na1a2a3an)

它的意義是對於新的排列,編號ai的元素將被編號i的元素所取代(不是位置)。其中a仍然是個排列,也就是保證了一一對應。

通俗地來說吧,置換就是一種特定的變換操作。

乘法

置換也可以相乘,其意義是把兩個置換的影響直接合成一種置換操作。

迴圈

我們稱關於n個元素的旋轉置換操作為迴圈。那麼我們會發現任何一個置換都可以由一個或多個互不相交的迴圈操作相乘得到。這些迴圈的階數是小於等於原置換的。

怎麼證明?因為置換是滿足一一對應的,那麼如果我們把

iai連邊,則可以得到一個或多個環,每個環對應著一個相應階數的迴圈。

Burnside引理

給出了多種判定兩方案本質相同的置換方案。用L表示本質不同的方案數,用|G|表示置換方案數,D(ai)表示在置換ai下不發生改變的方案數。那麼就有了這麼個結論。丟下結論就跑

L=1|G|D(ai)

Polya定理

但是我們會發現D(ai)是難以計算的,因為如果我們用樸素的搜尋來統計,時間複雜度是答案級別的。我們當然希望能優化它。(你問我|G|怎麼算?用手算)

假設我們現在考慮的置換方案如下,把它拆成迴圈乘積的形式,得到了3個迴圈,即它的迴圈節數為3。我們可以用

c(a)來表示置換方案a的迴圈節數。

(1234535142)=(13)(25)(4)

如果某方案在此置換下不變,就只需要把同一個迴圈中的元素搞的一樣即可。對於一類經典問題,即染色問題,對於n個珠子,染m種顏色,旋轉判定同構。

則有L=1nmc(ai)

例題

poj2154

題意:

用n種顏色染n個珠子,旋轉判定同構,問有多少種方案?答案對p取模。

題解:

我們有n種置換方案,不妨記旋轉i下為置換i。那麼置換i的迴圈長度應該是ngcd(n,i),相應的迴圈節數為

gcd(n,i)

L=1ni=1nngcd(n,i)
套用莫比烏斯反演的套路優化之。
L=d|nϕ(nd)nd1
時間複雜度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

題解戳我