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
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN = 100 + 5;

inline int gcd(int a,int b){ return b? gcd(b,a%b): a;}

const int base = 1e7;

struct Bigint
{
	vector<int> a;
	Bigint(ll x = 0)
	{
		while(x) a.emplace_back(x % base), x /= base;
	}
	Bigint operator + (const Bigint &oth) const
	{
		Bigint res; res.a.resize(max(a.size(), oth.a.size()));
		int c = 0;
		for(int i=0; i<(int)res.a.size(); ++i)
		{
			if(i<(int)a.size()) c += a[i];
			if(i<(int)oth.a.size()) c += oth.a[i];
			res.a[i] = c % base; c /= base;
		}
		if(c) res.a.emplace_back(c);
		return res;
	}
	Bigint operator * (int oth) const
	{
		if(oth == 0 || !a.size()) return Bigint(0);
		Bigint res; res.a.resize(a.size());
		ll c = 0;
		for(int i=0; i<(int)res.a.size(); ++i)
		{
			c += (ll)a[i] * oth;
			res.a[i] = c % base; c /= base;
		}
		while(c) res.a.emplace_back(c % base), c /= base;
		return res;
	}
	pair<Bigint,int> div(int oth) const
	{
		Bigint res; res.a.resize(a.size());
		ll c = 0;
		for(int i=(int)a.size()-1; i>=0; --i)
		{
			c = c * base + a[i];
			res.a[i] = c / oth; c %= oth;
		}
		while(res.a.size() && !res.a.back()) res.a.pop_back();
		return {res, c};
	}
	Bigint operator / (int oth) const { return div(oth).first;}
	int operator % (int oth) const { return div(oth).second;}
	
	Bigint& operator += (const Bigint &oth){ return *this = *this + oth;}
	Bigint& operator *= (int oth){ return *this = *this * oth;}
};

ostream& operator << (ostream &os,const Bigint &a)
{
	if(!a.a.size()) return os << "0";
	auto save = os.fill();
	os << a.a.back() << setfill('0');
	for(int i=(int)a.a.size()-2; i>=0; --i)
		os << setw(7) << a.a[i];
	os << setfill(save);
	return os;
}

Bigint f[MAXN];
vector<int> g[MAXN];

int main(void)
{
	ios :: sync_with_stdio(false);
	cin.tie(0);
	
	int n;
	cin >> n;
	for(int i=1; i<=n; ++i)
	{
		int len;
		cin >> len;
		g[i].resize(len);
		for(int &t: g[i])
			cin >> t;
	}
	
	if(!g[1].size())
	{
		printf("1\n");
		return 0;
	}
	
	for(int u: g[1])
		f[u] += 1;
	
	Bigint res = (int)g[1].size();
	for(int i=2; i<=n; ++i)
	{
		if(!g[i].size() || !f[i].a.size()) continue;
		
		int len = (int)g[i].size();
		int t = len / gcd(f[i] % len, len);
		
		res *= t;
		for(int j=i; j<=n; ++j)
			f[j] *= t;
		
		Bigint cur = f[i] / len;
		for(int v: g[i])
			f[v] += cur;
	}
	
	cout << res << endl;
	return 0;
}