先擴充一個之前講過的模型的性質
對於一個編號在\([0,n)\)的環(順時針編號),從編號為\(x\)的點開始順時針跳,每次跳\(k\)步,那麼最終經過的點一共有\(\frac{n}{d}\)個(其中\(d=\gcd(n,k)\)),如果我們將這\(\frac{n}{d}\)個點按照編號順序排成一個圓(不是按經過的順序),那麼相鄰兩個點之間的距離為\(d\)
證明:顯然將這\(\frac{n}{d}\)個點按照編號順序排成一個圓後,這個圓的總長度為\(n\)(相鄰兩點之間的距離為兩點編號差的絕對值)。考慮每個點的編號的形式,為\(x+t_1k-t_2n\),因為是從\(x\)每次跳\(k\)步,當跳過\(n\)時就要減去\(n\),所以編號的形式就是\(k,n\)的線性組合。故編號可以寫作\(x+td\),也就是說相鄰兩個點的距離是\(d\)的倍數,至少為\(d\);而總長度為\(n\),當且僅當任意相鄰兩個點之間的距離為\(d\)才為\(n\)(否則的話會更大),證畢
有了這個性質,我們就可以知道,原圖一共被分成了\(d\)個環,每個環的起點為\(x,x+1,x+2,...,x+d-1\)
現在我們考慮Burnside引理,假設我們現在已經獲得了\(S\)(也就是滿足題意的所有塗色方案),置換群\(G\)即順時針旋轉\(0,1,2,...,n-1\)步,我們現在要求的就是\(|S/G|\),只需要求\(|S^g|\)
現在我們考慮對於一個固定的\(g\)(也就是每次跳的步數\(k\)已經知道了),那麼根據上面的結論,我們只用考慮\(0,1,2,...,d-1\)這\(d\)個點構成的環滿足題意的塗色方案一共有多少種就好了
為什麼這裡不能用Polya定理:Polya定理的內容就是\(|B^{c(g)}|=|S^g|\),可以想一下這個為什麼成立,主要原因還是因為各個迴圈置換之間互不影響,所以可以任意塗色;而這裡顯然是會互相影響的,所以只能用Burnside引理
計算\(d\)個點構成的環滿足題意的塗色方案一共有多少種:很顯然的環形DP,但是這裡時間複雜度卡的比較緊,如果採用容斥原理(即按照線形計算,最後強制第一個點和最後一個點塗相同顏色)的話會超時(因為你要列舉第一個點塗的顏色),此時有一個最佳化:不採用容斥原理,而是採用正面計算,將\(f\)從一維變成二維,\(\forall i∈[0,m),f[i][i]=1\),這就是說第\(i\)個行向量表示第一個點只能塗第\(i\)種顏色,最後得到的陣列經過的時間為\(d+1\)(注意不是\(d\),因為我們要求最後一個點和第一個點塗的顏色相同,這裡相當於斷環成鏈了),然後加上\(f\)的對角線就好了
計算完\(f\)後,我們還不能列舉\(g\),因為\(n\)太大了,此時肯定只能列舉\(d\),最後不難知道要計算\(\phi(\frac{n}{d})\),這種計算約數的尤拉函式的技巧見這篇總結