🚧 This website is under construction. 🚧
AtCoder
ABC
201
E

XOR
ABC
E
Math

ABC201 E - Xor Distances

https://atcoder.jp/contests/abc201/tasks/abc201_e (opens in a new tab)
青色下位。XOR。

重要な知見 木上でパスの XOR は根からの XOR と等しい 同じものを xor すると単位元になるので、根からの各頂点へのパスの XOR を保持しておくと、ある 2 頂点のパスの XOR を求める時に重複する部分が消える

よってある頂点を根とした木の上で DFS を行い、頂点からの累積 xor を計算した上で各 bit ごとに xor 和を計算したらよい。 xor 和は、1 の個数とそうでないものの個数の積で求まる。

MOD = 10**9 + 7
 
n = int(input())
tree = [[] for _ in range(n)]
 
for _ in range(n - 1):
    u, v, w = map(int, input().split())
    tree[u - 1].append((v - 1, w))
    tree[v - 1].append((u - 1, w))
 
# xor[u] := 根からuまでのパスのxor
xor = [0] * n
 
stack = [(0, -1)]
while stack:
    u, p = stack.pop()
    for v, w in tree[u]:
        if v == p:
            continue
        xor[v] = xor[u] ^ w
        stack.append((v, u))
 
ans = 0
 
for shift in range(60):
    count_0 = count_1 = 0
    for u in range(n):
        if xor[u] >> shift & 1:
            count_1 += 1
        else:
            count_0 += 1
    ans += count_0 * count_1 * pow(2, shift, MOD) % MOD
    ans %= MOD
 
print(ans)