Beautiful Palindrome

2 secs 1024 MB
loop0919's icon loop0919

解説

M=1M = 1 の場合、N mod 998244353N ~ \mathrm{mod} ~ 998244353 が答えです。以降 M2M \ge 2 の場合を考えます。

正整数 kk が長さ MM の文字列の中に含まれるループ文字の個数としてあり得ることと、k1k - 1M1M - 1 の約数であることは同値です。
理由は、文字列の末尾のループ文字 11 個を除いたとき、11 個のループ文字とある非負整数個のスペースがこの順に並べられた文字列が kk 個並べられた文字列として考えられるためです。

また kk 個のループ文字を含む回文の個数は、先頭 k/2\lceil k / 2 \rceil 個のループ文字を決めれば、他の文字も決まるため Nk/2N^{\lceil k / 2 \rceil} 個となります。
よって、k1M1Nk/2 mod 998244353\displaystyle \sum_{k - 1 |M - 1} N ^{\lceil k/2 \rceil} ~ \mathrm{mod} ~ 998244353 が答えです。

M1M - 1 の約数の個数は O(M)O(\sqrt M) 個に抑えられ、累乗計算は繰り返し二乗法を用いて O(logN)O(\log N) で計算可能なため、 O(MlogN)O(\sqrt{M}\log N) で解くことができました。

想定解

C++
Python