#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e5+10;
LL gcd(LL a,LL b){
if(a>b)swap(a,b);
if(a==0)return b;
return gcd(b%a,a);
}
struct frac{LL a;LL b;frac():b(1){}};
frac Val(frac x){frac f;f.a=x.a/gcd(x.a,x.b);f.b=x.b/gcd(x.a,x.b);return f;}
frac jia(frac x,frac y){frac f;f.a=x.a*y.b+x.b*y.a;f.b=x.b*y.b;return f;}
frac cha(frac x,frac y){frac f;f.a=x.a*y.a;f.b=x.b*y.b;return f;}
struct Node{
vector<int> son;int x;
frac val(){frac f;f.a=1;f.b=x;return f;}
}node[maxn];
int N,M;bool fin[maxn];frac S[maxn],X;
queue<int> q;
void dfs(int cur,frac v){
v=Val(v);if(fin[cur]){S[cur]=jia(v,S[cur]);return;}
int sz=node[cur].x;
for(int i=0;i<sz;i++){
if(!fin[node[cur].son[i]])dfs(node[cur].son[i],cha(v,node[cur].val()));
else{
X=jia(S[node[cur].son[i]],cha(v,node[cur].val()));
S[node[cur].son[i]]=Val(X);
}
}
return;
}
void solve(){
for(int i=1;i<=N;i++)if(node[i].x==0)fin[i]=true;
frac f;f.a=f.b=1;
for(int i=1;i<=M;i++)dfs(i,f);
for(int i=1;i<=N;i++)if(fin[i])S[i]=Val(S[i]),printf("%lld %lld\n",S[i].a,S[i].b);
}
int main(){
//freopen("water.in","r",stdin);freopen("water.out","w",stdout);
scanf("%d%d",&N,&M);int tmp;
for(int i=1;i<=N;i++){
scanf("%d",&node[i].x);
for(int j=0;j<node[i].x;j++)scanf("%d",&tmp),node[i].son.push_back(tmp);
}
solve();
//fclose(stdin);fclose(stdout);
return 0;
}
先前洛谷90,信奥题库100,CCF 卡我到了80?
但为啥 MLE 啊