操作する場所 \(i \in N\) を全探索. 操作を何もしてないときも含めて,\(N+1\) 通りを考える. 何もしてないときの \(LCM(a)\) を \(L\) とおく. \(LCM_{j \in N, j \neq i}(a_{j})\) を \(L_{i}\) とおく.
\(i\) 番目を数えるかどうかは, \(a_{i}\) のある素因数 \(p\) の指数 \(e\) が,単独 max かを判定できれば良い.
- (0): その様な素因数 \(p\) が存在する場合, \(L_{i} \neq L\).
- (1): 存在しない場合, \(L_{i} = L\). この場合は,\(L_{i}\) の代わりに \(L\) の方を数える.
また,(0) を満たす \(i,j \in N, i \neq j\) を任意にとると, \(L_{i} \neq L_{j}\).
したがって,求める答えは,
(0) の \(i \in N\) の個数) + \(d\).
ここで, \(d\) は,(1) を満たす \(i\) が存在するなら \(1\), そうでなければ \(0\).
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
// p.first >= p.second
void change(pll &p, ll x){
if(x > p.first){
p.second = p.first;
p.first = x;
}else if(x > p.second){
p.second = x;
}
}
// return true iff 単独max
bool judge(pll p, ll x){
if(x == p.first){
if(x == p.second){
return false;
}else{
return true;
}
}else {
return false;
}
}
int main() {
ll n; cin >> n;
map<ll, pll> f;
rep(i,n){
ll m; cin >> m;
rep(j,m){
ll p,e ; cin >> p >> e;
mp[i][p] = e;
change(f[p], e);
}
}
ll ans = 1;
rep(i,n){
bool flg = false;
for(auto [p,e]:mp[i]){
if(judge(f[p], e)){
flg = true;
break;
}
}
if(flg){
ans++;
}
}
chmin(ans, n);
cout << ans << endl;
return 0;
}