公式

A - Multiples in the String 解説 by Nyaan


素朴に \(X\) の倍数を \(S\) の末尾に追加していく方法では \(S\) の長さ制限に収まらなくなります。よって、\(X\) の倍数が \(S\) に効率良く埋め込まれているような \((X, S)\) を選ぶ必要があります。
そのような構造を持つ整数の構成方法として、循環小数の持つ構造を利用する方法があります。例えば \(1/7 = 0.142857142857\dots\) を例にとります。循環節を取り出して出来る整数 \(142857\)\(X\)\(X\)\(2\) 個並べてできる整数 \(142857142857\)\(S\) とすると、

  • \(142857 \times 1 = 142857\) : \(\underline{\textbf{142857}}142857\)
  • \(142857 \times 2 = 285714\) : \(14\underline{\textbf{285714}}2857\)
  • \(142857 \times 3 = 428571\) : \(1\underline{\textbf{428571}}42857\)
  • \(142857 \times 4 = 571428\) : \(1428\underline{\textbf{571428}}57\)
  • \(142857 \times 5 = 714285\) : \(14285\underline{\textbf{714285}}7\)
  • \(142857 \times 6 = 857142\) : \(142\underline{\textbf{857142}}857\)

というように \(X \times 1\) から \(X \times 6\) までが \(S\) に埋め込まれた形をしています。
一般には、\(1/p\) の循環節の長さが \(p-1\) であるような素数 \(p\) に対して上記の方法を応用することで \(X\) および \(X \times 1, X \times 2, \dots, X \times (p - 1)\) が埋め込まれた整数 \(S\) を得ることが出来ます。
素数 \(p\) において \(1/p\) の循環節が \(p-1\) であることは「\(10^a \equiv 1 \pmod{p}\) を満たす最小の正整数 \(a\)\(p-1\) である」であることと等価であることが証明できるので、簡単な計算により条件を満たす \(p\) を得ることが出来ます。(あるいは実際に \(1/p\) を計算して循環節の長さを調べる方法でもよいでしょう。) このような方法により得られた \(1001 \leq p \leq 2500\) を満たす \(p\) (例えば \(p = 1019\)) を元に \((X, S)\) を得れば問題文の条件を全て満たすことができます。

投稿日時:
最終更新: