Submission #6393328
Source Code Expand
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10 ** 6)
import numpy as np
MOD = 10 ** 9 + 7
N = int(input())
graph = [[] for _ in range(N+1)]
for _ in range(N-1):
x,y = map(int,input().split())
graph[x].append(y)
graph[y].append(x)
"""
包除の原理。各頂点を根として
・偶数個を選ぶ、そこが反例となっている、他は何でもよい、
・奇数個を選ぶ、そこが反例となっている、他は何でもよい
・根を含む成分は保留してある。保留している頂点の数を持っておく。
・偶数個の場合と奇数の場合の差分だけ持っておく
"""
def dp_merge(data1,data2):
N1 = len(data1) - 1
N2 = len(data2) - 1
if N1 > N2:
N1,N2 = N2,N1
data1,data2 = data2,data1
data = np.zeros(N1+N2, dtype = np.int64)
for n in range(1,N1+1):
data[n:n+N2] += data1[n] * data2[1:] % MOD
data %= MOD
return data
fact_2 = [1,0,1]
for n in range(3,N+10):
fact_2.append(fact_2[n-2] * (n-1) % MOD)
fact_2 = np.array(fact_2, dtype = np.int64)
def dp_add_edge(data):
N = len(data) - 1
data1 = np.zeros(N+2, dtype=np.int64)
# 辺を反例に加えない
data1[1:] = data
# 辺を反例に加える
data1[1] = - (data * fact_2[:N+1] % MOD).sum() % MOD
return data1
def dfs(v, parent = None):
data = None
for y in graph[v]:
if y == parent:
continue
data1 = dfs(y, v)
# mergeする前に、最後の辺をひとつ加える
data1 = dp_add_edge(data1)
if data is None:
data = data1
else:
data = dp_merge(data, data1)
if data is None:
return np.array([0,1],dtype=np.int64)
return data
data = dfs(1)
answer = (data * fact_2[:N+1] % MOD).sum() % MOD
print(answer)
Submission Info
| Submission Time | |
|---|---|
| Task | E - Ribbons on Tree |
| User | maspy |
| Language | Python (3.4.3) |
| Score | 900 |
| Code Size | 1905 Byte |
| Status | AC |
| Exec Time | 993 ms |
| Memory | 17172 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 900 / 900 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt |
| All | 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 0_00.txt | AC | 148 ms | 12512 KiB |
| 0_01.txt | AC | 147 ms | 12468 KiB |
| 0_02.txt | AC | 149 ms | 12512 KiB |
| 0_03.txt | AC | 149 ms | 12512 KiB |
| 1_00.txt | AC | 149 ms | 12468 KiB |
| 1_01.txt | AC | 483 ms | 17172 KiB |
| 1_02.txt | AC | 745 ms | 13204 KiB |
| 1_03.txt | AC | 742 ms | 13204 KiB |
| 1_04.txt | AC | 742 ms | 13204 KiB |
| 1_05.txt | AC | 688 ms | 13208 KiB |
| 1_06.txt | AC | 993 ms | 13112 KiB |
| 1_07.txt | AC | 676 ms | 15056 KiB |
| 1_08.txt | AC | 636 ms | 14484 KiB |
| 1_09.txt | AC | 607 ms | 14220 KiB |
| 1_10.txt | AC | 578 ms | 13776 KiB |
| 1_11.txt | AC | 936 ms | 13080 KiB |
| 1_12.txt | AC | 889 ms | 13136 KiB |
| 1_13.txt | AC | 866 ms | 13136 KiB |
| 1_14.txt | AC | 795 ms | 15252 KiB |
| 1_15.txt | AC | 702 ms | 13204 KiB |
| 1_16.txt | AC | 694 ms | 13208 KiB |
| 1_17.txt | AC | 696 ms | 13208 KiB |
| 1_18.txt | AC | 699 ms | 13128 KiB |
| 1_19.txt | AC | 685 ms | 13128 KiB |
| 1_20.txt | AC | 658 ms | 13132 KiB |
| 1_21.txt | AC | 672 ms | 13120 KiB |
| 1_22.txt | AC | 657 ms | 13208 KiB |
| 1_23.txt | AC | 653 ms | 15000 KiB |
| 1_24.txt | AC | 649 ms | 13124 KiB |
| 1_25.txt | AC | 618 ms | 13376 KiB |
| 1_26.txt | AC | 600 ms | 14544 KiB |
| 1_27.txt | AC | 584 ms | 15044 KiB |
| 1_28.txt | AC | 566 ms | 15256 KiB |
| 1_29.txt | AC | 534 ms | 16068 KiB |