結果
| 問題 |
No.1227 I hate ThREE
|
| コンテスト | |
| ユーザー |
tyawanmusi
|
| 提出日時 | 2020-08-23 18:23:57 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 146 ms / 2,000 ms |
| コード長 | 1,149 bytes |
| コンパイル時間 | 400 ms |
| コンパイル使用メモリ | 82,212 KB |
| 実行使用メモリ | 115,508 KB |
| 最終ジャッジ日時 | 2025-01-02 05:32:26 |
| 合計ジャッジ時間 | 4,668 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 33 |
ソースコード
# 初期設定
import sys
sys.setrecursionlimit(2000)
input = sys.stdin.readline
mod = 10**9+7
# 入力 + Cを圧縮
n, c = map(int, input().split())
minc = min(n * 6 - 5, c)
edge = [[] for _ in range(n)]
for _ in range(n - 1):
a, b = map(int, input().split())
a -= 1
b -= 1
edge[a].append(b)
edge[b].append(a)
# dp初期化(初期値は1です)
dp = [minc * [1] for _ in range(n)]
# 再帰で実装します
# 返り値はdp_v
def dfs(r, v):
# vの親がr、vの子がu
for u in edge[v]:
if r == u:
continue
# dp_uを取得
dp_u = dfs(v, u)
for i in range(minc):
# dp_{u,i-3} + dp_{u,i+3}を求める
f = 0
if i > 2:
f += dp_u[i - 3]
if i < minc - 3:
f += dp_u[i + 3]
# かける
# p_v=iにすることが不可能な場合、f=0になる子が存在するのでこのままでよいです
dp[v][i] *= f
dp[v][i] %= mod
return dp[v]
# 頂点1を根としてDFS、dp_1を取得
rootdp = dfs(-1, 0)
# rootdpの総和に加え、Cを圧縮しただけansに加算
ans = sum(rootdp)
ans += rootdp[minc // 2] * (c - minc)
print(ans % mod)
tyawanmusi