1. 程式人生 > >【數學專題】(二) Burnside引理和Polya定理

【數學專題】(二) 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代表每種置換下的迴圈節。
HDU 5495 LCS 模擬置換群的求法,累加迴圈節-1 HDU 1812 Count the Tetris Polya定理+模擬
PKU 2409 Let it Bead
Polya定理+模擬
PKU 1286 Necklace of Beads
Polya定理+PKU 2409的簡化版
PKU 2154 Color
Polya定理+尤拉函式優化
HDU 2239 機器人的項鍊
Polya定理+尤拉函式優化 + 逆元
HDU 3923 Invoker
Polya定理+尤拉函式優化 + 逆元
HDU 3547 DIY Cube
Polya定理+模擬24種旋轉
UVA 10733 The Colored Cubes
Polya定理+模擬24種旋轉
HDU 3441 Rotation
Polya定理+結合方形旋轉和環形旋轉
PKU 2888 Magic Bracelet
Burnside引理+動態規劃+矩陣優化
HDU 2865 Birthday Toy
Burnside引理+動態規劃+矩陣優化
SCU 2658 The Queen's New Necklaces
Burnside引理+多重集排列
UVA 11255 Necklace
Burnside引理+多重集排列
UVA 10601 Cubes
Burnside引理+動態規劃+雜湊雜湊 HDU 3091 Necklace 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,得到 圖20        L為未知數,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)。
圖34 G(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了。