解説

・部分点解法

この問題において、制約の NNN20N \leq 20 と小さいので残すべき積み木の組み合わせ 2N10485761062^N \leq 1048576 \fallingdotseq 10^6 通りを全て列挙しても余裕で間に合います。(bit全探索)

後はその中から要素の和が KK になるような組み合わせを一つ見つけて出力すれば良いです。K=0K = 0 のときに一つも積み木を残さない組み合わせを選ばないように注意してください。

時間計算量は組み合わせの列挙に O(2N)O(2^N) 、列挙した組み合わせそれぞれに対しその要素の和が KK に等しいか判定するのに O(N)O(N) かかるので、全体として O(N×2N)O(N \times 2^N) となります。

・満点解法

こちらは制約の NNN=40N = 40 となり、残すべき積み木の組み合わせ 2N109951162777610122^N \leq 1099511627776 \fallingdotseq 10^{12} 通りを愚直に全列挙すると確実に間に合いません。

では、どのようにすればよいのでしょうか。ここでは、半分全探索というテクニックを使います。

まず、NN 個の積み木を N//2\lfloor N//2 \rfloor 個と N//2\lceil N//2 \rceil 個の 22 つのグループ(便宜上 A,BA,B とする)に分割します。そして、各グループについて、残すべき積み木の組み合わせを全列挙し、それぞれの組み合わせについてその要素の和を計算してその値を持っておきます。

そして、AA の各組み合わせ aia_i について、その和を SaiS_{a_i} としたときに、 BB の組み合わせ bjb_j でその和が KSaiK-S_{a_i} となるようなものを二分探索で探し、見つかれば ai,bja_i,b_j の要素を全て出力すれば良いです。

計算量を考えます。各グループについて、残すべき積み木の組み合わせを全列挙、組み合わせについてその要素の和を計算するのに O(N×2N2)O(N \times 2^{\frac{N}{2}}) となり、そのあとの操作は A,BA,B の組み合わせの個数をそれぞれ A,B|A|,|B| とすると O(Alog(B))O(|A|log(|B|)) となり、ここで AB2N2|A| \fallingdotseq |B| \fallingdotseq 2^{\frac{N}{2}} であるため、全体の時間計算量は O(N×2N2+2N2log(2N2))=O(N×2N2)O(N \times 2^{\frac{N}{2}}+2^{\frac{N}{2}}log(2^{\frac{N}{2}})) = O(N \times 2^{\frac{N}{2}}) となります。

部分点解法と同様にK=0K = 0 のときに一つも積み木を残さない組み合わせを選ばないように注意してください。