提出 #24451348


ソースコード 拡げる

import sys
sys.setrecursionlimit(10**5)

def calc_dp(i, parent=-1):
  global children, dp_b, dp_w, mod
  if children[i] == [parent]: # bottom case
    return 1, 1

  result_w = 1
  result_b = 1
  for j in children[i]:
    if j == parent:
      continue
    result_w *= (dp_w[j] + dp_b[j])
    result_b *= dp_w[j]
    result_w %= mod
    result_b %= mod

  return result_b, result_w

def tree_search(i, parent=-1):
  global children, dp_b, dp_w
  for j in children[i]:
    if j == parent: # 親ノードはスキップする
      continue
    tree_search(j, i) # i を親ノードとして、子ノード j を処理する

  dp_b[i], dp_w[i] = calc_dp(i, parent) # dp_b[i], dp_w[i] を計算する関数

def main(f):
  global children, dp_b, dp_w, mod
  mod = 10**9 + 7
  N = int(f.readline())
  children = [[] for _ in range(N+1)]
  dp_b = [None] * (N+1) # db_b[i] : 親が Black の場合の i 以下のサブツリーの場合の数
  dp_w = [None] * (N+1) # db_w[i] : 親が Black の場合の i 以下のサブツリーの場合の数
  for _ in range(N-1):
    x, y = list(map(int, f.readline().split()))
    children[y].append(x)
    children[x].append(y)

  tree_search(1)
  print((dp_b[1] + dp_w[1]) % mod)

main(sys.stdin)

提出情報

提出日時
問題 P - Independent Set
ユーザ enakai
言語 PyPy3 (7.3.0)
得点 100
コード長 1278 Byte
結果 AC
実行時間 1376 ms
メモリ 789560 KiB

ジャッジ結果

セット名 All
得点 / 配点 100 / 100
結果
AC × 20
セット名 テストケース
All 0_00, 0_01, 0_02, 0_03, 1_00, 1_01, 1_02, 1_03, 1_04, 1_05, 1_06, 1_07, 1_08, 1_09, 1_10, 1_11, 1_12, 1_13, 1_14, 1_15
ケース名 結果 実行時間 メモリ
0_00 AC 66 ms 61812 KiB
0_01 AC 51 ms 62128 KiB
0_02 AC 48 ms 62116 KiB
0_03 AC 51 ms 62056 KiB
1_00 AC 50 ms 62088 KiB
1_01 AC 907 ms 461092 KiB
1_02 AC 201 ms 93684 KiB
1_03 AC 181 ms 94392 KiB
1_04 AC 190 ms 92940 KiB
1_05 AC 220 ms 93720 KiB
1_06 AC 213 ms 93136 KiB
1_07 AC 215 ms 91992 KiB
1_08 AC 246 ms 92232 KiB
1_09 AC 237 ms 91868 KiB
1_10 AC 248 ms 92484 KiB
1_11 AC 253 ms 92024 KiB
1_12 AC 241 ms 93008 KiB
1_13 AC 265 ms 99576 KiB
1_14 AC 347 ms 152800 KiB
1_15 AC 1376 ms 789560 KiB