問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!
ここからは、bitmask DP と呼ばれる、bitmask による集合表現を用いた動的計画法でハミルトン路問題を解いていきます。
まずは、bitmask による集合の操作を実装しましょう。
bitmask による集合表現とは、100000010011 のような 2 進数表現を用いて、集合に各要素が含まれるかどうかを表現する方法です。
もし、i 番目のビットが 1 であれば i 番目の要素が含まれており、0 であれば含まれていないことを表します。けたは右から 0, 1, 2, ... と数えるので、たとえば集合 {0, 1, 4, 11} は 100000010011 と表現できます。
10 進数で 100000010011 を表すときは、2^0 + 2^1 + 2^4 + 2^11 = 2067 となります。
bitmask による集合表現として、10 進数で n が与えられます。この整数で表される集合に対して、以下の操作をおこなってください。
・集合に要素 m が含まれているかどうかを判定し、含まれていれば "Yes"、含まれていなければ "No" を出力する
・もし集合に要素 m が含まれていなければ、集合に要素 i を追加して、10 進数で出力する
n m
・ 集合に要素 m が含まれている場合
1 行で "Yes" を出力してください。
・ 集合に要素 m が含まれていない場合
1 行目に "No" を出力してください。
2 行目に、集合に要素 m を追加したものを 10 進数で出力してください。
また、末尾に改行を入れ、余計な文字を含んではいけません。
すべてのテストケースにおいて、以下の条件をみたします。
・ 入力はすべて整数
・ 0 ≦ n < 2^20
・ 0 ≦ m < 20
3 1
Yes
3 2
No
7