結果
| 問題 | No.1507 Road Blocked |
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:27:54 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 228 ms / 2,000 ms |
| コード長 | 1,829 bytes |
| 記録 | |
| コンパイル時間 | 253 ms |
| コンパイル使用メモリ | 82,944 KB |
| 実行使用メモリ | 109,016 KB |
| 最終ジャッジ日時 | 2025-03-31 17:28:07 |
| 合計ジャッジ時間 | 7,996 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 30 |
ソースコード
MOD = 998244353
def main():
import sys
input = sys.stdin.read
data = input().split()
n = int(data[0])
edges = [[] for _ in range(n+1)]
idx = 1
for _ in range(n-1):
u = int(data[idx])
v = int(data[idx+1])
edges[u].append(v)
edges[v].append(u)
idx += 2
# Calculate subtree sizes using non-recursive DFS with parent tracking
size = [1] * (n + 1)
parent = [0] * (n + 1)
stack = [(1, -1)] # (node, parent)
visited = [False] * (n + 1)
order = []
while stack:
node, p = stack.pop()
if visited[node]:
continue
visited[node] = True
parent[node] = p
order.append(node)
for neighbor in edges[node]:
if not visited[neighbor]:
stack.append((neighbor, node))
# Now process nodes in reverse order to compute sizes (post-order)
for node in reversed(order):
for neighbor in edges[node]:
if neighbor != parent[node]:
size[node] += size[neighbor]
inv2 = pow(2, MOD-2, MOD)
sum_contribution = 0
for v in range(2, n+1):
p = parent[v]
s = size[v]
# Compute C(s,2) + C(n-s,2) mod MOD
term1 = s % MOD * ((s-1) % MOD) % MOD
term1 = term1 * inv2 % MOD
term2 = ( (n - s) % MOD ) * ( (n - s - 1) % MOD ) % MOD
term2 = term2 * inv2 % MOD
sum_contribution = (sum_contribution + term1 + term2) % MOD
# Compute denominator: n*(n-1)^2 // 2 mod MOD
denom = n % MOD
denom = denom * ((n-1) % MOD) % MOD
denom = denom * ((n-1) % MOD) % MOD
denom = denom * inv2 % MOD
inv_denom = pow(denom, MOD-2, MOD)
result = sum_contribution * inv_denom % MOD
print(result)
if __name__ == "__main__":
main()
lam6er