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
AC × 4
AC × 34
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