結果
| 問題 |
No.2584 The University of Tree
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-11-27 21:22:19 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,750 ms / 3,000 ms |
| コード長 | 1,868 bytes |
| コンパイル時間 | 381 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 261,812 KB |
| 最終ジャッジ日時 | 2024-09-27 04:42:08 |
| 合計ジャッジ時間 | 39,751 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 53 |
ソースコード
from collections import deque
MOD=998244353
N=int(input())
gr=[]
road=[[] for i in range(N-1)]
for i in range(N):
C,*E=list(map(int,input().split()))
gr.append(E)
for j in E:
road[j-1].append(i)
ser=[{} for i in range(N)]
for i in range(N):
for j,k in enumerate(gr[i]):
if road[k-1][0]==i:
gr[i][j]=road[k-1][1]
else:
gr[i][j]=road[k-1][0]
ser[i][gr[i][j]]=j
dp=[[-1]*len(gr[i]) for i in range(N)]
top=[]
vert=deque([(0,0,-1)])
while len(vert)>0:
st,pos,bef=vert.pop()
if st==0:
top.append(pos)
vert.append((1,pos,bef))
for i in gr[pos]:
if i!=bef:
vert.append((0,i,pos))
else:
if bef==-1:
continue
prod=pos+1
ret=0
for i in range(ser[pos][bef]+1,len(gr[pos])):
ret+=dp[pos][ser[pos][gr[pos][i]]]*prod
prod*=pos+1
ret%=MOD
prod%=MOD
ret+=prod
prod*=pos+1
for i in range(ser[pos][bef]):
ret+=dp[pos][ser[pos][gr[pos][i]]]*prod
prod*=pos+1
ret%=MOD
prod%=MOD
dp[bef][ser[bef][pos]]=ret
for i in top:
lf=[0]
ri=[0]
rev=pow(i+1,-1,MOD)
prod=i+1
for j in dp[i]:
lf.append(lf[-1]+j*prod)
prod*=i+1
prod%=MOD
lf[-1]%=MOD
prod=rev
for j in reversed(dp[i]):
ri.append(ri[-1]+j*prod)
prod*=rev
prod%=MOD
ri[-1]%=MOD
cul=-2
cur=0
prod=i+1
for j in reversed(gr[i]):
dp[j][ser[j][i]]=prod+(lf[cul]+ri[cur])*prod
dp[j][ser[j][i]]%=MOD
prod*=i+1
prod%=MOD
cur+=1
cul-=1
for i in range(N):
ans=0
prod=i+1
for j in dp[i]:
ans+=j*prod
ans%=MOD
prod*=i+1
prod%=MOD
print(ans)