結果
問題 | No.2504 NOT Path Painting |
ユーザー |
|
提出日時 | 2023-02-21 08:47:46 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
|
実行時間 | - |
コード長 | 3,245 bytes |
コンパイル時間 | 488 ms |
コンパイル使用メモリ | 82,444 KB |
実行使用メモリ | 72,040 KB |
最終ジャッジ日時 | 2024-12-15 16:29:35 |
合計ジャッジ時間 | 4,428 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | RE * 21 |
ソースコード
import functoolsimport operatorfrom collections import dequefrom typing import ListP = 998244353def inv(n):# return 1 / nreturn pow(n, P - 2, P)def add(*args):# return sum(args)return sum(args) % Pdef mul(*args):# return functools.reduce(operator.mul, args, 1)res = 1for v in args:res = res * v % Preturn resdef edge_num(n: int):return (n * (n + 1)) >> 1def solve(n: int, g: List[List[int]]):m = edge_num(n)inv_m = inv(m)par_ = [0] * nsiz_ = [1] * ndef precalc(u: int, p: int):par_[u] = pfor v in g[u]:if v != p:siz_[u] += precalc(v, u)return siz_[u]precalc(0, -1)def subtree_size(u: int, p: int):if par_[u] == p:return siz_[u]else:return n - siz_[p]def calc_t_1(u: int, ng1: int):return n - subtree_size(ng1, u)def calc_t_2(u: int, ng1: int, ng2: int):return n - subtree_size(ng1, u) - subtree_size(ng2, u)ans_f = [0] * nfor x in range(n):u_x = m - sum(edge_num(subtree_size(y, x)) for y in g[x])ans_f[x] = mul(m, inv(m - u_x))ans_g = [[0] * n for _ in range(n)]par = [[-1] * n for _ in range(n)]# x, y, A, Bdq = deque()for x in range(n):u_x = edge_num(n) - sum(edge_num(subtree_size(y, x)) for y in g[x])for y in g[x]:s_y = subtree_size(y, x)par[x][y] = xdq.append((x, y, mul(u_x - s_y * (n - s_y), ans_f[x]), 0))while dq:x, z, A, B = dq.popleft()par_z = par[x][z]s_z = subtree_size(z, par_z)u_z = edge_num(s_z) - sum(edge_num(subtree_size(y, z)) for y in g[z] if y != par_z)t_z = s_zans_g[x][z] = add(A, mul(u_z, ans_f[z]), B)prev_z2, z2 = z, par_zwhile z2 != x:next_z2 = par[x][z2]t_z2 = calc_t_2(z2, prev_z2, next_z2)ans_g[x][z] = add(ans_g[x][z], mul(t_z, t_z2, ans_g[z][z2]))prev_z2, z2 = z2, next_z2t_x = calc_t_1(x, prev_z2)ans_g[x][z] = add(1, mul(ans_g[x][z], inv_m))ans_g[x][z] = mul(ans_g[x][z], inv(1 - mul(t_x, t_z, inv_m)))for y in g[z]:if y == par_z:continues_y = subtree_size(y, z)next_t_z = t_z - s_ynext_A = add(A, mul(u_z - s_y * (s_z - s_y), ans_f[z]))next_B = add(B, mul(next_t_z, t_x, ans_g[x][z]))prev_z2, z2 = z, par_zwhile z2 != x:next_z2 = par[x][z2]t_z2 = calc_t_2(z2, prev_z2, next_z2)next_B = add(next_B, mul(next_t_z, t_z2, ans_g[z][z2]))prev_z2, z2 = z2, next_z2par[x][y] = zdq.append((x, y, next_A, next_B))ans = 1for x in range(n):ans = add(ans, mul(ans_f[x], inv_m))for y in range(x):ans = add(ans, mul(ans_g[x][y], inv_m))print(ans)n = int(input())g = [[] for _ in range(n)]for _ in range(n - 1):u, v = map(int, input().split())u -= 1v -= 1g[u].append(v)g[v].append(u)solve(n, g)