1. 程式人生 > 其它 >[做題記錄] Luogu P4607 [SDOI2018]反迴文串 題解

[做題記錄] Luogu P4607 [SDOI2018]反迴文串 題解

題意

「迴文串什麼的最討厭了……」

小 Q 討厭任何形式的迴文串:

  1. 如果一個字串從左往右讀和從右往左讀是一樣的,那麼小 Q 討厭它;例如 aaaba
  2. 對於一個字串來說,若將某個字首子串移除並拼接到字串的尾部,能得到一個小 Q 討厭的字串,那麼小 Q 也會討厭原來的這個字串;例如 aabbaa

現在問題來了,如果任意字串只可以由 \(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\) 即可。