atcoder#AGC050F. [AGC050F] NAND Tree
[AGC050F] NAND Tree
配点 : 点
問題文
各頂点に または が書かれた木があります。 この木は 個の頂点を持ち、それらには から までの番号が振られています。 各 について、頂点 と頂点 を結ぶ辺が存在します。 頂点 に書かれた数は です。
すぬけ君は、この木に以下の操作を繰り返します。
- 辺を 本選んで縮約し、消された 個の頂点に書かれていた数の NAND を新たな頂点に書き込む。
回の操作後、木は 個の頂点となります。 このような操作の行い方は 通りありますが、そのうち最後の頂点に が書き込まれるものは何通りあるでしょうか。 この答えを 2 で割った余りを計算してください。
注記
- 演算 NAND の定義は次の通りです: $NAND(0, 0) = NAND(0, 1) = NAND(1, 0) = 1, NAND(1, 1) = 0$.
- 頂点 と頂点 を結ぶ辺を縮約する際は、その辺を取り除くと同時に 頂点を併合します。 縮約後の木において、併合により生まれた頂点と頂点 を結ぶ辺が存在するのは、縮約前の木において と を結ぶ辺または と を結ぶ辺が存在するときであり、またそのときに限られます。
制約
- 入力が表すグラフは木である。
- 入力中の全ての値は整数である。
入力
入力は標準入力から以下の形式で与えられる。
出力
答えを出力せよ。
4
1 2
2 3
2 4
0 1 1 0
0
通りの操作順のうち 通りで最後の頂点に が書き込まれることがわかります。よって、答えは です。
4
1 2
2 3
3 4
1 1 0 1
1
20
3 15
1 12
10 16
3 19
5 20
1 9
6 13
14 19
2 4
8 11
12 16
6 20
2 17
16 18
17 19
7 10
16 20
2 20
8 20
1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 1 1 1 0 0
0