The 46th World Championship ICPC W問題:Riddle of the Sphinx

問題. Riddle of the Sphinx

3種類の生物がいる。それぞれの種類の足の数を答えよ。

問題を解くためにスフィンクスに「 a, b, c」という形式の質問を 5 回行う。これは 3 種類の生物がそれぞれ  a, b, c 匹いるときの足の本数の合計を訊ねる質問である。この質問に対してスフィンクス r と答えるが、5回の質問のうち多くても 1 回は嘘をつく場合がある。

制約 0 \le a, b, c \le 10 0 \le r \le 10^5

解法.

 i 回目( 1 \le i \le 5)の質問を  a_i, b_i, c_i とし、その返答を  r_i とする。また、答えである 3 種類の生物の足の本数をそれぞれ  l_a, l_b, l_c とする。
初めの 4 回の質問を次のように行う。

  1.  (a_1, b_1, c_1) = (1, 0, 0)
  2.  (a_2, b_2, c_2) = (0, 1, 0)
  3.  (a_3, b_3, c_3) = (0, 0, 1)
  4.  (a_4, b_4, c_4) = (1, 1, 1)

もし、 r_4 = r_1 + r_2 + r_3 ならばこの 4 回の質問で嘘は付かれていないので、答えは  (l_a, l_b, l_c) = (r_1, r_2, r_3) となる。

それ以外  r_4 \neq r_1 + r_2 + r_3 の場合を考える。すなわち、4 回の質問の内ちょうど 1 回嘘を付かれている場合である。ここまでの質問で答えの候補  (l_a, l_b, l_c) は次の 4 通りに絞られる。

 (r_4 - r_2 - r_3, r_2, r_3) :1回目の質問への答えが嘘の場合(2, 3, 4 回目の質問への答えは本当)
 (r_1, r_4 - r_1 - r_3, r_3) :2 回目の質問への答えが嘘の場合(1, 3, 4 回目の質問への答えは本当)
 (r_1, r_2, r_4 - r_1 - r_2) :3回目の質問への答えが嘘の場合(1, 2, 4 回目の質問への答えは本当)
 (r_1, r_2, r_3) :4回目の質問への答えが嘘の場合(1, 2, 3 回目の質問への答えは本当)

残りの 1 回の質問でこれら 4 つの答えの候補から 1 つに絞りたい。ただし、最後の質問は必ず正しいことが上の仮定から保証されている。質問「 a, b, c」で上の 4 つの返答がすべて異なるようにしたい。すなわち、

①'  r'_1 = a (r_4 - r_2 - r_3) + b r_2 + c r_3
②'  r'_2 = a r_1 + b (r_4 - r_1 - r_3) c r_3
③'  r'_3 = a r_1 + b r_2 + c (r_4 - r_1 - r_2)
④'  r'_4 = a r_1 + b r_2 + c r_2

としたときに、 r'_1 \neq r'_2 \neq r'_3 \neq r'_4 となる  0 \le a, b, c \le 10 を見つけたい。この条件を  r_4 \neq r_1 + r_2 + r_3 であることに注意して書き下すと、

  •  r'_1 \neq r'_2 より、 a (r_4 - r_1 - r_2 - r_3) \neq b (r_4 - r_1 - r_2 - r_3) \Rightarrow a \neq b
  •  r'_1 \neq r'_3 より、 a (r_4 - r_1 - r_2 - r_3) \neq c (r_4 - r_1 - r_2 - r_3) \Rightarrow a \neq c
  •  r'_1 \neq r'_4 より、 a (r_4 - r_1 - r_2 - r_3) \neq 0 \Rightarrow a \neq 0
  •  r'_2 \neq r'_3 より、 b (r_4 - r_1 - r_2 - r_3) \neq c (r_4 - r_1 - r_2 - r_3) \Rightarrow b \neq c
  •  r'_2 \neq r'_4 より、 b (r_4 - r_1 - r_2 - r_3) \neq 0 \Rightarrow b \neq 0
  •  r'_3 \neq r'_4 より、 c (r_4 - r_1 - r_2 - r_3) \neq 0 \Rightarrow c \neq 0

となる。したがって、 a \ne b \ne c \ne 0 を満たす  a, b, c を 5 回目の質問として訊ねる。
候補はたくさんあるので実装では  (a_5, b_5, c_5) = (1, 2, 3) として質問をした。①', ②', ③', ④' の  (a, b, c) (a_5, b_5, c_5) を代入して計算した  r'_i r_5 に等しい  i (①, ②, ③, ④ のどれか)が答えとなる。

計算時間 O(1)

 

コンテスト中なら真面目に 5 回目の質問の証明をしないで、 ①, ②, ③, ④ が一意になるような  a_5, b_5, c_5 を全探索するかも(そのような  a_5, b_5, c_5 が存在することは答えがあるというメタ読みで)。

この問題難しくて時間かかった。8分で通しているチームがあるらして…すごい。