結果
| 問題 |
No.1227 I hate ThREE
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2020-09-12 01:55:22 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,715 bytes |
| コンパイル時間 | 173 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 130,940 KB |
| 最終ジャッジ日時 | 2024-12-29 14:18:32 |
| 合計ジャッジ時間 | 44,736 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 18 TLE * 15 |
ソースコード
"""
mod で場合分け
→使える数字の数が変わる
使える数字がX種類の時
数字の付け方を
2 <= X <= N の範囲で求めればいい?
1<=p<=Cの制約の影響を受けない範囲は省いてdp
"""
from sys import stdin
import sys
sys.setrecursionlimit(20000)
def dfs(v,p,num):
if memo[v][num] != None:
return memo[v][num]
ret = 1
for nex in lis[v]:
tmp = 0
if nex != p:
if num+1 < c:
tmp += dfs(nex,v,num+1)
if num-1 >= 0:
tmp += dfs(nex,v,num-1)
ret *= tmp
ret %= mod
memo[v][num] = ret
return ret
N,C = map(int,stdin.readline().split())
lis = [ [] for i in range(N) ]
for i in range(N-1):
a,b = map(int,stdin.readline().split())
a -= 1
b -= 1
lis[a].append(b)
lis[b].append(a)
#mod 0
mod = 10**9+7
ans = 0
c = C//3
if c < 4*N:
memo = [ [None] * c for i in range(N) ]
for i in range(c):
ans += dfs(0,0,i)
else:
memo = [ [None] * (2*N) for i in range(N) ]
for i in range(N):
ans += dfs(0,0,i) * 2
ans += pow(2,N-1,mod) * (c-2*N)
c = (C+2)//3
if c < 4*N:
memo = [ [None] * c for i in range(N) ]
for i in range(c):
ans += dfs(0,0,i)
else:
memo = [ [None] * (2*N) for i in range(N) ]
for i in range(N):
ans += dfs(0,0,i) * 2
ans += pow(2,N-1,mod) * (c-2*N)
c = (C+1)//3
if c < 2*N:
memo = [ [None] * c for i in range(N) ]
for i in range(c):
ans += dfs(0,0,i)
else:
memo = [ [None] * (2*N) for i in range(N) ]
for i in range(N):
ans += dfs(0,0,i) * 2
ans += pow(2,N-1,mod) * (c-2*N)
print (ans % mod)
SPD_9X2