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
95
96
97
#include <bits/stdc++.h>

using namespace std;

constexpr int S = 103;

typedef long long ll;

bool fix = true;
int n, a, act = 0;
vector<int> v[S];
int in[S];
int odw[S];
ll ile[S];
ll wynik;

ll nwd(ll aa, ll bb)
{
    while(bb)
    {
        swap(aa %= bb, bb);
    }
    return aa;
}

ll nww(ll aa, ll bb)
{
    return (aa / nwd(aa, bb)) * bb;
}

void update(ll aa)
{
    wynik = nww(wynik, aa);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin  >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a;
        v[i].resize(a);
        for(int j = 0; j < a; j++)
        {
            cin >> v[i][j];
            in[v[i][j]]++;
        }
    }
    if(v[1].size() == 0)
    {
        cout << 1;
        return 0;
    }
    wynik = v[1].size();
    while(fix)
    {
        fix = false;
        act++;
        for(int i : v[1])
        {
            ile[i] = wynik / v[1].size();
            odw[i] = act;
        }
        for(int i = 2; i <= n; i++)
        {
            if(in[i] != 0 && v[i].size() != 0)
            {
                if(ile[i] % v[i].size() != 0)
                {
                    fix = true;
                    break;
                }
                for(int j : v[i])
                {
                    if(odw[j] != act)
                    {
                        odw[j] = act;
                        ile[j] = ile[i] / v[i].size();
                    }
                    else
                    {
                        ile[j] += ile[i] / v[i].size();
                    }
                }
            }
        }
        if(fix)
        {
            wynik += v[1].size();
        }
    }
    cout << wynik;
    return 0;
}