結果
問題 |
No.1507 Road Blocked
|
ユーザー |
![]() |
提出日時 | 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()