Copyright (C) IOI日本委員会 1996. All rights reserved.


問題4.

 x1, x2, ..., xn は 0 または 1 だけを値にとる変数であり、f は x1, x2, ..., xn のうちのいくつかの積であることがわかっている関数 であるが、f が具体的にどの変数の積であるかはわかっていない。 しかし幸いなことに、x1, x2, ..., xn の値を入力すると、それに対する f の 値を出力する実行形式のプログラムが存在する(ソースプログラムは存在しない)。 このプログラムを使って f を具体的に求めたい。

  プログラムを実行してみる回数をできるだけ少なくして f を求めるには、 入力値 (x1, x2, ..., xn) としてどのような値をどのような順序で与えたら よいか? 下記(1)、(2)それぞれの場合について、f を決めるためのアルゴリズムを考えよ。 アルゴリズムは下記の例に示したように日本語で説明すればよく、プログラムを書く必要はない。

 この問題は、アルゴリズムの効率と説明の明瞭さをもとに採点する。

(1) f が何個の変数の積であるかが不明のとき。
(2) f が 2 個の変数の積であるとわかっているとき。

(例) n = 5, f = x1*x3*x5とする。この場合、例えば (x1, x2, x3, x4, x5) = (1, 1, 1, 1, 1) のとき f = 1、 (0, 0, 1, 1, 1) のとき f = 0 である。

 f を決めるためのアルゴリズムは、例えば次のようなものである (n = 5 という特別の場合についてではなく、一般の n の場合について 述べる必要がある)。

 f が

      x1, x2, ..., xn,
      x1x2, x1x3, ..., xn-1xn,
      x1x2x3, ..., xn-2xn-1xn,
           ...
      x1x2...xn
のうちのどれであるかをこの順にチェックする。そのために、 各々の予想式ごとに、(x1, x2, ..., xn) の値の組み合わせすべてについて、 プログラムで計算した f の値と予想式の値とが一致するかどうかを調べる。 そのようなものが最初に見つかったら終了する。


JOIホームページへ戻る

JOI'96へ戻る