1. 程式人生 > >【POJ2888】Magic Bracelet-Burnside引理+數論+DP矩陣優化

【POJ2888】Magic Bracelet-Burnside引理+數論+DP矩陣優化

測試地址:Magic Bracelet
題目大意:要用N(109)顆珠子連成環形的手鐲,共有M(10)種不同的珠子,規定K個條件,每個條件規定某兩種珠子不能相鄰,旋轉後相同的方案視作相同,問有多少種本質不同的方案,對9973取模(gcd(N,9973)=1)。
做法:這題非常經典,思路很有代表性,是進階Burnside引理和Polya定理題的一塊敲門磚,需要用到:Burnside引理,尤拉函式,DP+矩陣快速冪,乘法逆元。
首先一看題目是計數,就自然而然地聯想到Burnside引理和Polya定理,然而這題有不能相鄰的條件,所以不能直接用Polya定理,那麼我們考慮使用Burnside引理來解決。
我們知道環形的旋轉置換有N

種,第i種置換(這裡定義為旋轉i顆珠子的置換)的迴圈數為gcd(N,i),觀察這樣的置換,我們發現它很有規律:第1個元素屬於第1個迴圈,第2個元素屬於第2個迴圈,…,第gcd(N,i)個元素屬於第gcd(N,i)個迴圈,第gcd(N,i)+1個元素屬於第1個迴圈,以此類推。由於我們計算|C(f)|時每個迴圈內元素著色應該相同,那麼我們實際上只需確定前gcd(N,i)個元素的填色方案數即可。設對前i個元素進行著色,且最後一個元素顏色為j的方案數為f(i,j),並設二元函式m(i,j),表示如果i,j兩種顏色的珠子可以相鄰,那麼m(i,j)=1,否則m(i,j)=0,那麼我們可以得到狀態轉移方程:
f
(i,j)=Mk=1m(j,k)×f(i1,k)

但是最後一個元素的填色除了和它前一個元素有關,還和第一個元素有關,那麼這個狀態轉移方程是不是錯的呢?實際上,我們只需一開始列舉第一個元素的顏色k,然後這一種情況的答案就是第gcd(N,i)+1個元素與第一個元素同色的方案數,即:f(gcd(N,i)+1,k),累加每種情況即可得出|C(f)|。帶進Burnside公式計算之後,最外面還要乘一個1/N,由於gcd(N,9973)=1,所以我們直接求N關於模9973的乘法逆元,然後再乘即可。
上面的方法的時間複雜度是O(N2M),顯然不能通過此題,需要考慮優化。此題需要從兩個方面入手,一是計算Burnside公式的複雜度,而是動態規劃的複雜度。
首先優化計算Burnside公式的時間複雜度。我們知道gcd
(N,i)|N
,而且當gcd(N,i)相同時,|C(f)|相同,那麼我們完全可以列舉N的因子d,計算gcd(N,i)=d時的|C(f)|,再乘上使得gcd(N,i)=di的個數,累加起來得到答案。後面那個個數顯然就是φ(N/d)了(不懂的可以去看看我寫的POJ2154的題解),那麼列舉的時間複雜度就大大降低了。
接下來優化DP的時間複雜度,注意到M很小,那麼二元函式m顯然可以構造成一個矩陣M,如果我們把f(i,1),f(i,2),...,f(i,M)從上到下排成一個列向量Fi,那麼可以看出:Fi=MFi1,所以Fi=Mi1F1,於是我們可以先用矩陣快速冪算出Md,然後就可以算Fd+1了,但其實我們沒有必要算出全部的Fd+1,因為我們只要求f(d+1,k),這是第k行第1列的元素,那麼就用

相關推薦

POJ2888Magic Bracelet-Burnside+數論+DP矩陣優化

測試地址:Magic Bracelet 題目大意:要用N(≤109)顆珠子連成環形的手鐲,共有M(≤10)種不同的珠子,規定K個條件,每個條件規定某兩種珠子不能相鄰,旋轉後相同的方案視作相同,問有多少

hdu2481Toy,burnside+矩陣乘法

傳送門 思路: 快把我做哭了TAT 從昨天上午開始想,搞了一下午有一個點沒有想明白 TA爺看過題後想了5min貌似就爆正解了TAT 下面我就來講一講~ 一開始先想沒有置換情況下的方案數 手玩無果後打了表…… 然後就是 F(1)=1,F(2)=5

BZOJ1004Cards(組合數學,Burnside

getchar 多次 等價 要求 std tdi cst 多少 存在 【BZOJ1004】Cards(組合數學,Burnside引理) 題面 Description   小春現在很清閑,面對書桌上的N張牌,他決定給每張染色,目前小春只有3種顏色:紅色,藍色,綠色.他詢問Su

BZOJ3202項鏈(莫比烏斯反演,Burnside

相同 可能 urn cst i+1 arp com 最大 要求 【BZOJ3202】項鏈(莫比烏斯反演,Burnside引理) 題面 BZOJ 洛谷 題解 首先讀完題目,很明顯的感覺就是,分成了兩個部分計算。 首先計算本質不同的珠子個數,再計算本質不同的項鏈個數。 前面一個

數學專題(二) Burnside和Polya定理

Burnside引理   筆者第一次看到Burnside引理那個公式的時候一頭霧水,找了本組合數學的書一看,全是概念。後來慢慢從Polya定理開始,做了一些題總算理解了。本文將從最簡單的例子出發,解釋Burnside引理和Polya定理。然後提供一些自己做過的和上述定理相關的

poj2888 Magic Bracelet-Burnside

這是第一次碰到polya定理用動態規劃的矩陣優化來做題,前面都是無條件染顏色的基礎題。原理引用的部落格中講得非常清楚。 以下是我的草稿,當做是個補充吧 #include<cstdio> #include<iostream> #include

Burnside和Polya定理

開始 多少 tails 沒有 -s 圖片 detail 最簡 方案 轉載自:https://blog.csdn.net/whereisherofrom/article/details/79631703 Burnside引理   筆者第一次看到Burnside引理那個公式的時

Burnside與Polya定理

本質 left sum bsp 之間 染色 polya begin 兩個 感覺這兩個東西好鬼畜= = ,考場上出了肯定不會qwq。不過還是學一下吧用來裝逼也是極好的 群的定義 與下文知識無關。。 給出一個集合$G = \{a, b, c, \dots \}$和集合上的

置換群和Burnside,Polya定理

因子 不同的 mir details 構造 itl 置換群 模型 遇到 定義簡化版: 置換,就是一個1~n的排列,是一個1~n排列對1~n的映射 置換群,所有的置換的集合。 經常會遇到求本質不同的構造,如旋轉不同構,翻轉交換不同構等。 不動點:一個置換中,置換後和置換前沒有

burnside&polya定理

連接 集合 置換群 產生 side 交換 進行 置換 polya burnside引理&polya定理 置換: 置換即是將n個元素的染色進行交換,產生一個新的染色方案。 群: 一個元素的集合G與一個二元運算(*)構成一個群。群滿足一下性質: 封閉性:\(\fo

WIFI[esp8266]-上電腳初始化狀態問題

ESP8266EX 上電時引腳的初始化狀態 問題: ESP8266EX 使用SDK:NONOS_SDK_1.5.3_16_04_18,IOT_demo中的light。 上電後的350ms內,GPIO12,GPIO13,GPIO14引腳的電平始終為高電平。 在使用ESP8266EX

ZOJ4061Magic Multiplication(構造)

題意:定義一個新運算為兩個數A,B上每一位相乘,然後順次接在一起,現在給定結果C和原來兩個數字的長度,要求恢復成原來的數字A,B 若有多解輸出A字典序最小的,A相同輸出B字典序最小的,無解輸出Impossible n,m<=2e5,sigma lenc<=2e6 思路:實際上只需要列舉A的第

Burnside和Polya定理之間的聯絡

最近,研究了兩天的Burnside定理和Polya之間的聯絡,百思不得其解,然後直到遇到下面的問題: 對顏色限制的染色 例:對正五邊形的三個頂點著紅色,對其餘的兩個頂點著藍色,問有多少種非等價的著色? 其中置換的方法有旋轉 \(0^{\circ}, 72^{\circ}, 144^{\circ}, 21

洛谷 P3307 [SDOI2013]項鍊 burnside+polya定理+莫比烏斯反演

題目描述 項鍊是人體的裝飾品之一,是最早出現的首飾。項鍊除了具有裝飾功能之外,有些項 鏈還具有特殊顯示作用,如天主教徒的十字架鏈和佛教徒的念珠。 從古至今人們為了美化人體本身,也美 化環境,製造了各種不同風格,不同特點、不同式樣的項鍊,滿足了不同膚色、不同民族、

HDU4016Magic Bitwise And Operation(dfs)

Magic Bitwise And Operation Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 1716    Acce

等價類計數(Polya定理/Burnside)學習筆記

  參考:劉汝佳《演算法競賽入門經典訓練指南》   感覺是非常遠古的東西了,幾乎從來沒有看到過需要用這個的題,還是學一發以防翻車。   置換:排列的一一對映。置換乘法相當於函式複合。滿足結合律,不滿足交換律。   置換的迴圈分解:即將置換看成一張有向圖,分解成若干迴圈。迴圈的數量稱為迴圈節。   以置

BZOJ1004 HNOI2008Cards(Burnside+動態規劃)

  直接給了一個置換群(當然要自己手動加上不洗牌的情況)。考慮求不動點數量即可。對於一個置換,求出所有迴圈的長度,然後設f[i][x][y]為給前i個迴圈著色後,用了x張紅色卡片、y張綠色卡片的方案數,dp一發即可。 #include<iostream> #include<cstd

[學習筆記]置換群 置換群和Burnside,Polya定理

這是群論。 置換群是群論的一種:必須要知道的: 置換群和Burnside引理,Polya定理   理解一下; 這裡置換就是旋轉同構的表示,方案就是“染色方案” m種置換,假如所有可能的方案,每種同構的方案都算了m次。(每種置換都有一次),那麼直接除以m即可。 但是有的方案並沒有被計

ACM_置換群 burnside Polya定理

置換群也是群論當中一個比較重要的內容,可是在離散課上老師直接跳過了這章內容我也是……(日了dog了),自己看了半天資料總算是有點眉目了。 1.置換群: 首先我們來介紹一下置換,設S為一個n個元素的集合

ACM 置換群 burnside Polya定理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!