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
def gcd(a, b):
    if a == 0:
        return b
    if b == 0:
        return a
    r = a % b
    while r != 0:
        a = b
        b = r
        r = a % b
    return b

def lcm(a, b):
    d = gcd(a, b)
    if d == 0:
        return 0
    return (a // d) * b

n = int(input())

nast = []

for i in range(n):
    # my_str = input()
    # list_of_strings = my_str.split(' ')
    # list_of_integers = list(map(int, list_of_strings[1:]))
    # nast.append(list_of_integers)
    lst = list(map(int, input().strip().split()))[1:]
    nast.append(lst)

ile = [[0, 1] for _ in range(n)]
ile[0] = [1, 1]
# print(ile)

# for i in range(n):
#     a = ile[i][0]
#     b = ile[i][1]
#     print(i, ': ', a, ' ', b, '\n')

T = 1
for i in range(n):
    okres = len(nast[i])
    li = ile[i][0]
    mi = ile[i][1] * okres

    # print(i + 1, ": ", li, okres, lcm(li, okres))
    # if li != 0:
    #     print(lcm(li, okres) // li, ile[i][1])

    if li != 0: # coś wchodzi
        if okres != 0: # coś wychodzi
            if okres == 1:
                t = 1
            else:
                t = (lcm(li, okres) // li) * ile[i][1]  
        else:
            t = 1
        # print('t =', t)
        T = lcm(T, t)

    for j in nast[i]:
        lj = ile[j - 1][0]
        mj = ile[j - 1][1]
        m = lcm(mi, mj)
        l = (m // mi) * li + (m // mj) * lj
        d = gcd(l, m)
        ile[j - 1][0] = l // d
        ile[j - 1][1] = m // d
    # print(ile)
        
print(T)