100点の提出がwriter含めて自分以外なかったので書いてます。 考えてて楽しかったので、気になる人は問題からみてください。
問題概要
真理値の変数が $(x_{1},x_{2},...,x_{N})$ と $N(\leq 10)$ 個ある。変数の組み合わせは $2^{N}$ 通りあるが、このうち入力で与えられる $K$ 通りの組み合わせを特別な組み合わせとする。
$\text{AND,OR,NOT,XOR}$ の論理ゲートを用いて、変数の組み合わせが特別なら $1$ をそうでないなら $0$ を返すような組み合わせ回路をできるだけ少ない数の論理ゲートを用いて作りなさい。
全てのテストケースに対して、ゲートの数が500以下で満点。
方針
数学的帰納法チックに考えます。 ある $N=k$ について、正しく返す回路があったとします。 この存在を用いて $N=k+1$ のときに正しく返す回路を作ることを考えます。
$K$ 個の組み合わせのうち、 $x_{k+1}=1$ であるような変数の組み合わせの $x_{k+1}$ を除いたもの集合を $S$ とします。
$k$ 個の変数を用いて $S$ に含まれているなら $1$ 、そうでないなら $0$ を返す回路は仮定より組めます。
この回路の返り値と $x_{k+1}$ を $\text{AND}$ ゲートに通せば $K$ 個のうち $x_{k+1}=1$ であるような変数の組み合わせに対してのみは $1$ を返すことができます。
$x_{k+1}=0$ である場合も、 $\text{NOT}$ ゲートを用いて同様に組むことができます。
ここで、 $N$ 個の変数に対して条件を満たす回路の論理ゲートの数を $f(N)$ とするとき、以下の漸化式が成り立ちます。
$f(N+1)=A+2f(N)$
$f(N+a)=A(2^{a}-1)+(2^{a})f(N)$
ただし、 $A$ はマージするのに必要なゲートの数で、上の図の場合だと $A=4$ です。
ここで、 $N=1$ のとき、2つの論理ゲートで目標を達成できることから $f(1)=2$ とすると、
$f(10)=A(2^{9}-1)+(2^{9})f(1)=3068$
となります。
上の式を見るとわかるのですが、この値は深さに対して指数的に増えるので、前計算をすることで、 $A$ の値や深さを改善していきます。
改善
まず、 $A$ の改善ですが、 $\text{NOT}$ を前計算するだけで、 $A=3$ となります。
次に深さの改善ですが、今回は前計算に $84$ 個のゲートを用いて、 $f(4)=3$ とします。
まず、 $2^{2^{2}}=16$ より、「$N=2$ のときの特別な変数の組み合わせ」の組み合わせは $16$ 通りあります。これを $16$ 個のゲートを用いて作ります。(ここの作り方は省略します。)
$(x_{3},x_{4})$の組み合わせは $4$ 通りあるので、 $4$ 個のゲートを使って、この2つの変数の真理値がある組み合わせの時にしか $1$ を返さないゲートを作り、$64$ 個の論理ゲートを用いて、 「$N=4$ かつ、特別な変数の組み合わせの $(x_{3},x_{4})$ が $K$ 個全てで等しい」ときに答えを正しく出力するものを作ります。
このようにすると、$N=4$ のときは$4$ つの値を $\text{OR}$ でマージすることで、 $f(4)=3$ を達成できます。
以上の改善によって、
$f(10)=3(2^{6}-1)+3^{6}f(4)=381$
となります。 前計算で使ったゲートの数が、 $10+84=94$ なので、全体で $475$ 個のゲートで題意を満たす回路を構成できます。
まとめ
公式解説 にはマラソンによる改善や、特別な変数の組み合わせを減らすことによるゲート数の削減などがあり、この解法をベースにしてもっとゲートの数を減らせそうな気がします。
これを思いつくのは簡単ではなかったですが、満点が提出されていないのは意外でした。 当時は放置されてたのかな...