2020年1月14日火曜日

CodeChef January Challenge 2020 - Chefina and Prefix Suffix Sums

0+sufN=pre1+sufN1=pre2+sufN2=...=preN+00+suf_N = pre_1 + suf_{N-1} = pre_2+suf_{N-2} = ... = pre_N + 0であることに注目する。この等式より、pren=sufnpre_n = suf_n入力全体の和/(N+1)入力全体の和/(N+1)と一致しなければならない。この数が入力の中に2つなければ答えは00である。

さて、この2数を除いた2(N1)2(N-1)個の数の中から残りを埋めることになる。まず、ai+bi=Sa_i + b_i = Sになるような数の組み合わせを入力から探す。これらを

{a1,b1},{a2,b2},...,{ak,bk} \{a_1, b_1\}, \{a_2, b_2\}, ..., \{a_k, b_k\}

とするとき、すべてのppについてapa_pbpb_pは入力の中に必ず同数存在しなければならない。逆に同数あれば、prei=appre_i = a_pのときsufNi=bpsuf_{N-i} = b_pprei=bppre_i = b_pのときsufNi=apsuf_{N-i} = a_p)のように埋めていけば有効な列ができることになる。

{a1,b1},{a2,b2},...,{ak,bk}\{a_1, b_1\}, \{a_2, b_2\}, ..., \{a_k, b_k\}がそれぞれc1,...,ckc_1, ..., c_kペアあるとわかったら、あとは{a1,b1}\{a_1, b_1\}から順にN1N-1個の位置を埋めていけばよい。つまり、

(N1c1)2c1(N1c1c2)2c2...(N1c1...ck1ck)2ck \binom{N-1}{c_1}2^{c_1} \cdot \binom{N-1-c_1}{c_2}2^{c_2} \cdot ... \cdot \binom{N-1-c_1-...-c_{k-1}}{c_k}2^{c_k}

が答えになる。N1N-1箇所の空きからc1c_1個選んで、さらにa1a_1b1b_1のどちらを置くか選んで…… というイメージ。ai=bia_i = b_iのケースは22掛けがないので注意すること。


冒頭の事実に気づくのになんと二日かかってしまった。