結果
| 問題 |
No.1227 I hate ThREE
|
| コンテスト | |
| ユーザー |
tyawanmusi
|
| 提出日時 | 2020-08-23 18:24:32 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,149 bytes |
| コンパイル時間 | 113 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 244,096 KB |
| 最終ジャッジ日時 | 2024-11-15 15:54:20 |
| 合計ジャッジ時間 | 38,794 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 28 TLE * 5 |
ソースコード
# 初期設定
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