#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,m,ind[100005],outd[100005],last[100005],tot,p[100005],q[100005];
int gcd(int x,int y){
if(x<y)swap(x,y);
return y==0?x:gcd(y,x%y);
}
int lcm(int x,int y){
return (x*y)/gcd(x,y);
}
struct edge{
int prev,to;
}e[200006];
void add(int a,int b){
e[++tot]=edge{last[a],b};
last[a]=tot;
}
void dfs(int x){
for(int i=last[x];i;i=e[i].prev){
int y=e[i].to,lm,bei1,bei2;
if(outd[y]==0){
lm=lcm(q[x],q[y]);
bei1=lm/q[y];
bei2=lm/q[x];
p[y]=p[y]*bei1+p[x]*bei2;
q[y]=lm;//最后处理约分问题
}
else{
p[y]=p[x];
q[y]=q[x]*outd[x];
}
dfs(y);
}
}
int main(){
// freopen("water.in","r",stdin);
// freopen("water.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
int d;
cin>>d;
for(int j=1;j<=d;j++){
int x;
cin>>x;
add(i,x);
outd[i]++;
ind[x]++;
}
}
for(int i=1;i<=m;i++){
dfs(i);
}
for(int i=1;i<=n;i++){
if(outd[i]==0){
int gc=gcd(p[i],q[i]);
cout<<p[i]/gc<<' '<<q[i]/gc<<endl;
}
}
return 0 ;
}
当时在考场上就一直这个问题,给我整的心态崩了,按照我的预算这题能拿40分的,但是就是没有输出,当时调了一个小时也没调出来,因为这个我没拿上三等奖,今天想起来求助一下各位dalao