#!/usr/bin/env python
def gcd(a, b):
if not b:
return a
return gcd(b, a % b)
def lcm(a, b):
return a // gcd(a, b) * b
def simplify(a, b):
gcd_v = gcd(a, b)
a //= gcd_v
b //= gcd_v
return a, b
class Sol:
def __init__(self, n):
self.n = n
self.input: list[int] = [0] * (n + 2)
self.v: list[list[int]] = list(map(lambda _: [], range(n+2)))
self.rv: list[list[int]] = list(map(lambda _: [], range(n+2)))
self.resultA = [0] * (n + 2)
self.resultB = [0] * (n + 2)
self.v[0].append(1)
self.rv[1].append(0)
self.resultA[0] = self.resultA[n + 1] = 1
self.resultB[0] = self.resultB[n + 1] = 1
for i in range(1, n+1):
r, *vals = input().split()
for v in vals:
self.v[i].append(int(v))
if not int(r):
self.v[i].append(n + 1)
self.rv[n+1].append(i)
self.resultA[i] = 1
self.resultB[i] = 1
self.dfs(1)
q = [1]
while q:
val = q.pop()
if val == n + 1:
continue
for child in self.v[val]:
self.input[child] -= 1
if not self.input[child]:
q.append(child)
sum_a = 0
sum_b = 1
for parent in self.rv[val]:
lcm_v = lcm(self.resultB[parent], sum_b)
sum_a = lcm_v // sum_b * sum_a + lcm_v // self.resultB[parent] * self.resultA[parent]
sum_b = lcm_v
sum_a, sum_b = simplify(sum_a, sum_b)
# print(f'Ja, {parent} daje tobie dziecku {val}')
self.resultA[val] = sum_a
self.resultB[val] = sum_b * len(self.v[val])
self.resultA[val], self.resultB[val] = simplify(self.resultA[val], self.resultB[val])
# print(f'Ja, {val}, daję każdemu dziecku {self.resultA[val]}/{self.resultB[val]}')
final_time = 1
for i in range(1, n+1):
final_time = lcm(final_time, self.resultB[i])
print(int(final_time))
def dfs(self, val):
for child in self.v[val]:
self.input[child] += 1
self.rv[child].append(val)
if self.input[child] == 1:
self.dfs(child)
if __name__ == '__main__':
n = int(input())
Sol(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #!/usr/bin/env python def gcd(a, b): if not b: return a return gcd(b, a % b) def lcm(a, b): return a // gcd(a, b) * b def simplify(a, b): gcd_v = gcd(a, b) a //= gcd_v b //= gcd_v return a, b class Sol: def __init__(self, n): self.n = n self.input: list[int] = [0] * (n + 2) self.v: list[list[int]] = list(map(lambda _: [], range(n+2))) self.rv: list[list[int]] = list(map(lambda _: [], range(n+2))) self.resultA = [0] * (n + 2) self.resultB = [0] * (n + 2) self.v[0].append(1) self.rv[1].append(0) self.resultA[0] = self.resultA[n + 1] = 1 self.resultB[0] = self.resultB[n + 1] = 1 for i in range(1, n+1): r, *vals = input().split() for v in vals: self.v[i].append(int(v)) if not int(r): self.v[i].append(n + 1) self.rv[n+1].append(i) self.resultA[i] = 1 self.resultB[i] = 1 self.dfs(1) q = [1] while q: val = q.pop() if val == n + 1: continue for child in self.v[val]: self.input[child] -= 1 if not self.input[child]: q.append(child) sum_a = 0 sum_b = 1 for parent in self.rv[val]: lcm_v = lcm(self.resultB[parent], sum_b) sum_a = lcm_v // sum_b * sum_a + lcm_v // self.resultB[parent] * self.resultA[parent] sum_b = lcm_v sum_a, sum_b = simplify(sum_a, sum_b) # print(f'Ja, {parent} daje tobie dziecku {val}') self.resultA[val] = sum_a self.resultB[val] = sum_b * len(self.v[val]) self.resultA[val], self.resultB[val] = simplify(self.resultA[val], self.resultB[val]) # print(f'Ja, {val}, daję każdemu dziecku {self.resultA[val]}/{self.resultB[val]}') final_time = 1 for i in range(1, n+1): final_time = lcm(final_time, self.resultB[i]) print(int(final_time)) def dfs(self, val): for child in self.v[val]: self.input[child] += 1 self.rv[child].append(val) if self.input[child] == 1: self.dfs(child) if __name__ == '__main__': n = int(input()) Sol(n) |
English