感觉atcoder上的题克我啊。。。
C
$ O(n^4) $ 的DP很好想,题解说有 $ O(n^3) $ 的写法,大概是每个数都减去 $ A $ 就不用考虑选的数的个数这一维。
D
根号分治。对于大于 $ \sqrt{n} $ 的 $ b $ ,要让 $ \lfloor \frac{n}{b} \rfloor + n \bmod b = m $ ,数论分块,对于同一块, $ n \bmod r < n \bmod l (\lfloor \frac{n}{l} \rfloor = \lfloor \frac{n}{r} \rfloor, r > l) $ 。对于小于 $ \sqrt{n} $ 的 $ b $ ,直接暴力,计算一个 $ b $ 的时间复杂度是 $ \log{n} $ 的。
E
每次向尽可能远的地方跳,用倍增维护。注意从左往右和从右往左是不一样的,要维护两个倍增数组。
F
除了每个字母都相同(周期为1)的情况,其他的答案都不大于2。
这是由于不存在周期的情况下答案为1,存在周期(大于2)的情况下在第一个位置后断开就构造了一个解。
现在只需要数答案为2的方案数。其实只要每个位置试着断一下,判断左右两边是否都没有周期就行。
至于如何快速找周期,其实只要求border就行。kmp即可。