約数
愚直に の先頭から 文字目 までを の候補とし,それより後がその文字列の繰り返しになっているかを確認する方法では,最悪ケースで計算量が となり実行時間制限を超過してしまいます。
そこで, の生成手順に注目すると, の候補は絞られることが分かります。
は空文字列に を 回以上連結させて生成されるので, は の倍数になっています。
つまり, は の約数になっているので,先頭からの長さが の約数となる文字列のみを調べれば良いです。
の先頭から長さ の文字列 が であるかを判定するには,それより後の文字列が の繰り返しになっているかを調べます。
の場合は であるので, は です。
の場合は, を満たすすべての について が成立するならば は であり,そうでなければ は ではありません。
が小さいものから調べていき,最初に として適切なものが答えになります。
最後に計算量についてです。
の約数列挙は, から順に試し割りをする素朴な実装で です。
そして の候補は の約数の個数 だけあり, つの候補を調べるのに かかるので,最終的な計算量は と見積もれます。
実際の約数の個数は, では高々 個( と と )であり,すべて試して間に合います。
「 の約数の個数は では高々 個」という正確な数値は知っていなくても, の約数の個数は( が大きいほど) に比べて非常に小さいことを知っていれば,ざっくりと計算量を見積もって,間に合うことが予測できます。
なお,この問題は別のアルゴリズムにより で解くこともできます。(ヒント(逆から読め):nasiekeamonuohpmk)
実装例(C++)