EDPC O - Matching
マッチング
考え方
ABCでいうと、E問題級。
いわゆる bitDP。
マッチングの状態を bit で表したものを添字に取り、その状態ごとのマッチング数を動的計画法で求める。
dp[i] を、女性の集合を bit で表したものが i であるときのマッチング数とする。
ただし、男性側は「最初の popcount(i) 人」を見ていることにする。
たとえば、$n=5$ で i=13 なら、$13$ は二進数で 01101 である。
このとき、男性は最初の $3$ 人、つまり $0,1,2$ 人目で、女性は bit に対応する $0,2,3$ 人目である。
dp[13] は、この $3$ 人ずつのマッチング数を意味する。
状態 i を考えるとき、最後に追加された男性は popcount(i)-1 人目である。
この男性を、集合 i に含まれる女性 j とペアにすると、残りは i^(1<<j) の状態になる。
したがって、dp[i] は、i 内の相性がよい全ての女性 j について、dp[i^(1<<j)] の値を足せばよい。
計算量は $O(N2^N)$。
入力例1での動作
入力を受け取る。
n: 3
a:
{0, 1, 1}
{1, 0, 1}
{1, 1, 1}
女性 $0,1,2$ に対応する bit を下位から並べ、使っている女性を $1$ とする。
立っている bit の数だけ、男性を $0$ 番から順に使っている状態と考える。
誰も使っていない 000 のマッチングは $1$ 通りである。
001 では、男性 $0$ 番と女性 $0$ 番を組ませる。
この $2$ 人は相性が悪いので、$0$ 通りである。
010 では、男性 $0$ 番と女性 $1$ 番を組ませる。
この $2$ 人は相性がよいので、$1$ 通りである。
011 では、男性 $0,1$ 番と女性 $0,1$ 番を組ませる。
男性 $1$ 番は女性 $0$ 番とは組める。
女性 $1$ 番とは組めない。
そのため、男性 $1$ 番と女性 $0$ 番を組ませる。
残る男性 $0$ 番と女性 $1$ 番も相性がよい。
したがって、011 は $1$ 通りである。
全ての状態について求めると、次のようになる。
| bit | 使用する女性 | マッチング数 |
|---|---|---|
000 |
なし | $1$ |
001 |
$0$ | $0$ |
010 |
$1$ | $1$ |
011 |
$0,1$ | $1$ |
100 |
$2$ | $1$ |
101 |
$0,2$ | $1$ |
110 |
$1,2$ | $1$ |
111 |
$0,1,2$ | $3$ |
111 は全員を使う状態である。
男性 $2$ 番は、全ての女性と相性がよい。
女性 $0$ 番と組む場合、残りの組み方は 110 の $1$ 通りである。
女性 $1$ 番と組む場合は、101 の $1$ 通りである。
女性 $2$ 番と組む場合は、011 の $1$ 通りである。
したがって、全員を組ませる方法は $1+1+1=3$ 通りである。
答えは $3$。
注意点
答えは $10^9+7$ で割った余りを要求されているので、剰余類環の考えに従って処理する。
足し算をするたびに結果を % 1000000007 する。
別解
特になし。