[做題記錄] Luogu P4607 [SDOI2018]反迴文串 題解
題意
「迴文串什麼的最討厭了……」
小 Q 討厭任何形式的迴文串:
- 如果一個字串從左往右讀和從右往左讀是一樣的,那麼小 Q 討厭它;例如
aa
和aba
。- 對於一個字串來說,若將某個字首子串移除並拼接到字串的尾部,能得到一個小 Q 討厭的字串,那麼小 Q 也會討厭原來的這個字串;例如
aab
和baa
。現在問題來了,如果任意字串只可以由 \(k\) 種已知的字元組成 (也就是說字符集的大小為 \(k\) ),那麼長度為 \(n\) 的所有字串裡,有多少字串是小 Q 討厭的?
答案可能很大,你只需要給出答案對 \(p\) 取模後的值。
\(T \leq 10, n, k\leq 10^{18}\)
, \(p\) 不一定是素數。
題解
這是人做的????
考慮一個計算答案的方式是列舉迴文串, 然後這個迴文串的所有迴圈移位進行一次貢獻。
但是這樣顯然會算重, 因為可能出現迴文串之間的迴圈同構, 也有可能串在迴圈移位的時候會得到自身。
考慮對於每一個迴文串, 求一個最小的 \(l\) 使得這個串在迴圈移位 \(l\) 次以後會再次變成一個迴文串, 那麼 \(\sum l\) 就是答案。
考慮 \(l\) 的取值在不同字串下的情況。
一個經典的想法是, 對於最小迴圈節 \(T\) , 如果 \(T\) 是偶數, 那麼 \(l = \frac{T}{2}\) , 否則 \(l = T\)。
那麼現在我們考慮對於最小迴圈節為某個數的字串計數。
考慮設 \(h(i) = 長度為i的字串的l = i \times \frac{1 + [i是奇數]}{2}\) , \(f(i)\) 表示最小迴圈節為 \(i\) 的字串的個數。
那麼答案就是 :
\[\sum_{d|n}f(d) h(d) \]又因為
\[\sum_{d|n}f(d)=k^{\lceil\frac n2\rceil}=g(n) \]所以
\[f(n) = \sum_{d|n}g(d) \mu(\frac{n}{d}) \\ ans = \sum_{i | n}g(i)\sum_{d | \frac{n}{i}}\mu(d)h(id) \]然後這裡思路就又卡住了。
考慮把 \(h(id)\) 拆開來看, 變成 \(d \times h(i)\) 。
觀察 \(h(id) \neq d \times h(i)\) 的時候當且僅當 \(d\) 為偶數, 且 \(i\) 為奇數, 注意此時 \(\frac{n}{i}\) 也是偶數。
不妨考慮 \(i\) 為奇數, \(\frac{n}{i}\) 是偶數這個條件下, 下面式子的取值:
\[\sum_{d|\frac{n}{i}}\mu(d)h(id) \]由於 \(\frac{n}{i}\) 是偶數, 所以可以對於 \(d\) 是否是偶數分別討論, 發現此時 \(\mu\) 相反, \(h\) 相等, 恰好是 \(0\) 。
那麼可以變換原來的式子 :
\[ans = \sum_{i|n}g(i)f(i)\sum_{d|\frac{n}{i}}d\mu(d) \]注意雖然前面說明了那個情況下沒有貢獻, 但是列舉的時候要注意 \(i\) 是奇數, \(\frac{n}{i}\) 是偶數的時候, 要跳過去。
然後考慮後面那個東西, 其實就是把 \(\frac{n}{i}\) 質因數分解以後, 求 \(\prod_{i = 1}^k (1 - p_i)\) , 上 \(PR\) 即可。