問題5 解説

 一言で言えば,「2n 桁または 2n + 1 桁の回文数であって(かつ,2n + 1 桁の場合には中央の桁が c であること),素数であるもののうち最大のものを求めよ」という問題である.ここで,回文数とは,123321 のように数字の並びを前から読んでも後から読んでも同じであるような正整数のことである.
 IOI(国際情報オリンピック)の問題文はほとんどがこのように長文で,かつ日常的なものを題材として出題されるので,この問題は長文の読解力を見ることを意図して出題した.問題文は長いが,後で述べる 1 点を除き,問題自体はそれほど難問ではない(問題 3 や問題 4 の方がむずかしい).

 先ず,回文数であるかどうかをチェックする方法について考える.扱う数は 2n または 2n + 1 桁の整数である.問題文には明記されていない(明記すべきであった)が,入力データを見ると,n の最大値は 10 であるが,c≧0 であるような n の最大値は 4 である.したがって,c≧0 の場合,2n + 1 桁の整数の値は 109 - 1 以下であるから 64 ビット数で表せるので,その各桁は容易に計算することができ,回文数であるかどうかのチェックも時間をかけずに容易にできる.
 一方,c<0 の場合,扱う数は 2n 桁(偶数桁)の整数であるが,n≧2 ならば(つまり,4 桁以上の偶数桁の整数は)11 で割り切れるので,求める答は 102n - 1 になる(偶数桁でも,n = 1 のときだけが例外で,題意を満たす 11 という素数がある).なぜなら,2n 桁の正整数を ab…cc…ba とすると(a, b, c は 1 桁の数を表す),

  (102n-1 + 1) a + 10 (102n-3 + 1) b + … + 10n(10 + 1) c

で,(a奇数 + 1) は (a + 1) で割り切れるから.これが,この問題の 1 つのトリックであった(数学的思考が求められた).このことに気付かずに素直に素数性の判定をすると,1 時間以上の計算時間が必要となるであろう.

 次にやることは,2n + 1 桁の回文数の中で最大のものを求めることである.それには,999…999(2n + 1 桁)から 100…001(2n + 1 桁)まで大きい方から順に整数 N を動かし,それが回文数であり,かつ素数であるかどうかを判定すればよい.素数かどうかの判定は,ごく普通のやり方(2 および,2 〜 [N の平方根] の範囲にある奇数で割ってみて,どれでも割り切れなければ素数とする)をやればよい.