[Note] Burnsde 引理 & Polya 定理

是很好的總結了。因爲總是會找不到所以貼一下(


polya定理小結

  polya定理是組合數學中比較難的一部分。首先需要對置換羣、集合論有一定的瞭解,這樣有助於理解burnside引理的證明。其次,polya定理只是對於在環上存在旋轉、反射等等價的變換的一種計數方法,實際的題目中很多需要其他的知識來進行輔助。
  環上的計數主要就是處理置換 -> 着色這種情況。很關鍵的一點是同一循環內着色相同。因此很多題目就在置換和着色上下文章。
  最最簡單的polya定理題目是置換數目很少,每種顏色不限,這種情況下只需手工數出所有的置換就可以了,一般就是一個公式。
  難一點的要麼是顏色數有限,需要用排列組合的知識或動態規劃來幫助計數;要麼是置換非常多,需要利用數論的知識來優化。當然還有其他的題型,比如對於相鄰着色的限制,這樣的題目就很困難了。
polya題目:
HOJ 2084 The Colored Cubes
HOJ 2647 Megaminx
POJ 1286 Necklace of Beads
POJ 2409 Let it Bead
TOJ 2795 The Queen’s New Necklaces
HDU 1812 Count the Tetris
UVa 11255 Necklace
POJ 2154 Color
POJ 2888 Magic Bracelet
UVa 10601 Cubes
NUAA 1110

polya定理再小結

  原來簡單的總結過polya定理:http://www.cppblog.com/sdfond/archive/2009/05/12/82665.html
  這裏再次把一些polya定理的題目歸一下類~
  話說ICPC的題目是越來越難,因爲經典的算法大家都知道了,因此出題的方向只能是要麼把模型隱藏的很深,要麼就把一系列算法知識綜合起來考察,這個時候分析問題的能力和靈活運用知識的能力就顯得尤爲重要。
  polya定理在很久以前的ICPC題目中就已經出現過,不過那個時候大家對於置換羣都瞭解不多,因此polya定理算是很生僻的一個東西。然而人類總是飛速的進步,現在互聯網上鋪天蓋地的題解使得polya定理走出深閨,逐漸被廣大acmer所熟知。但是魔高一尺道高一丈,出題人也逐漸把polya定理的題出得越來越難做,越來越不好想,今天我就來總結一下這些頗有難度的polya定理題目(包括Burnside引理)。
  polya定理主要就是解決一類着色問題,或者說是同構計數問題。設染色方案數是n,置換羣個數是p,置換羣長度是s,那麼利用Burnside引理,通過考察每個染色方案和每個置換羣,可以在O(nsp)時間複雜度計算出答案。polya定理巧妙的利用同一循環內着色相同這個事實,避開了枚舉着色方案,使得複雜度降到了O(sp)。但是利用polya定理的條件就是對於染色沒有限制,如果不滿足這個條件(比如對於不同循環節的染色限制,顏色數的限制等等),就沒法直接使用polya定理。另一方面,同構計數無論如何也無法避開找置換羣,因此很多題目也在這個上面做文章,把置換羣弄得非常多,使得常規的枚舉無法滿足要求,必須尋求優化解法。
  這樣討論下來就可以把polya定理分成幾個等級,最簡單的就是找出置換羣,染色就行了,這類代表題目有:
    HOJ 2084 The Colored Cubes
    HOJ 2647 Megaminx
    POJ 1286 Necklace of Beads
    POJ 2409 Let it Bead
    HDU 1812 Count the Tetris
  這些題目都是polya定理最基本的應用,當然以後估計再也見不到這樣的題目了,因爲太赤裸裸了。
  第二個等級的題目難度就略微提升了一些,比如加入顏色限制,這樣就要用Burnside引理:
    TJU 2795 The Queen’s New Necklaces
  這個題目就是對每種顏色的個數進行了限制,不過因爲置換羣很有規律,我用的是多重集排列來計數的。
    UVa 10601 Cubes
  也是限制了顏色數,但是這個題裏置換羣比較沒規律,我是直接搜的。
    UVa 11255 Necklace
  和上面兩個題目類似,我也是用排列組合直接數了,寫起來有些麻煩,也許用dp更簡單些。
    POJ 2154 Color
  這個題目是一個里程碑,它標誌着一類題目的優化方法。同樣是項鍊旋轉,因爲置換羣數量太多,利用數論的知識優化。
  第三個等級就比較變態了,幾乎沒有一看就能想出來的題目。這類題目的特點是,非常綜合,用到了很多知識;有的題目難點甚至不在求解同構計數的部分。
    POJ 2888 Magic Bracelet 難度指數:★★★
  一道很不錯的題目,這裏加入連接限制同時還考察優化,優化方法同上。連接限制如何處理?注意到項鍊個數很少,因此可以建圖,然後分別求出每種顏色連接n個珠子後回到自身的方案數,累加即可,這裏可以用矩陣快速冪求解。
    TJU 3352 Birthday Toy 難度指數:★★★
  這個題目出得也很不錯,同樣是加入鏈接限制,不過這裏的連接限制很有規律性,是相鄰的珠子不可以染成同色,因此可以列出遞推關係,最後化簡成公式求解。此外由於還是項鍊旋轉,用到了一樣的優化方式(這個優化方式已經被考爛了)。
    HDU 2481 Toy      難度指數:★★★★
  08年成都現場賽題目,難點在於求解遞推關係。這個題目比較新穎的地方在於不是染色了,而是同構圖計數。首先由於圖形的特殊性可以推出遞推關係(不是很好想),然後利用矩陣求解。此外這個題目把同一循環節的縮成了一個珠子,利用這用方式來考慮問題,是一種新的思路。此外由於還是項鍊旋轉,用到了一樣的優化方式(凡是跟項鍊有關的就沒有不考這個的了)。這個題目詳盡的題解在這裏:http://hi.baidu.com/spellbreaker/blog/item/1a7d9902ff6844e409fa93fb.html
    SGU 282 Isomorphism  難度指數:★★★★★
  這個題目比較新穎,置換非常多,因此需要一些巧妙的方法優化。置換的個數達到了n!,但是可以通過搜索來枚舉每個循環節的長度,把複雜度降到了求解n的分拆數方案數那麼多。設n = L1 + L2 + … + Lm,那麼滿足這個類型的置換個數是n! / (L1 * L2 * … * Lm * k1! * k2! * … * kt!),其中t是不同的循環節長度的個數,ki是每種循環節長度,這個公式的大體思想就是:首先因爲是置換,因此每個循環節內的數是固定的,把一個循環節內的數看成1個就變成了多重集的排列,但是每個循環節(Li)內,第一個數有(Li - 1)種選法(只要不是自己就行),第二個數有(Li - 2)種選法,依次類推,因此每個循環節還要乘以(Li - 1)!;之後因爲對於兩個同樣長度的循環節,一旦選定了位置,其實不可以互換,因此要把多餘的方案除掉,最後就是上述的公式。找出了置換的個數,接下來的問題就是,因爲題目是對邊染色,因此要把點置換映射成邊置換。通過小範圍的觀察可以發現(具體證明不太會):一個長度爲L的點循環節對應[L/2]個邊循環節,兩個長度分別是L1、L2的點循環節對應gcd(L1, L2)個邊循環節。因爲polya定理同一循環節內染色相同,因此不必關心對應後的邊循環節長度,只要知道個數即可(這一點很巧妙),所以這樣映射便可以求出結果。最後要注意的是題目說明了模一個素數,因此可以預處理出逆元來。
    SPOJ 422 Transposing is Even More Fun    難度指數:★★★★★
  這個題目需要一些觀察力。把地址轉置之後對應的寫下來,會發現,一個長度爲L循環節只需要移動L-1次(利用一個元素進行對換),這樣假設有k個循環節,那麼答案就是2 ^ (a + b) - k,關鍵問題是如何求k。循環節的個數其實就是相當於地址右移若干個b位後本質不同的地址個數,這樣就劃歸到了polya定理的範疇。長度爲a+b的地址一共可以右移(a + b) / (a, b)次(之後就出現循環了),因此這就是置換的個數。現在分別考慮每個置換下不同的地址個數,設g = gcd(a, b),那麼可以看成一共有(a + b) / g個珠子,每個大小是2 ^ g,這樣如果移動i下,那麼對應的本質不同的地址個數是(2 ^ g) ^ gcd(i, (a + b) / g)多個(類似於項鍊旋轉),最後累加然後除以總置換數即可。
  然後的問題就是如何高效求解,由於數據組數非常多,利用歐拉函數以O(sqrt(a + b))的複雜度依然TLE。後來參照cyx的論文,實現了一個理論複雜度看似很高但是實際很快的方法。記f[i]表示滿足gcd(i, (a + b) / g)是i的個數,先把總數分配給1,然後對(a + b) / g因式分解,用類似bfs的方法,擴展當前狀態,如果從x擴展到了xp,那麼就把x總數的1/p分給xp,注意不要重複擴展,利用一個單調隊列讓每個和數都唯一的被它的最小素因子擴展一次即可。這個方法複雜度難以估計但是很快出解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章