有人和我一样80吗qwq,慌得一批。。。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define B cerr<<"Break Point"<<endl;
#define P(x) cerr<<#x<<" "<<x<<endl;
namespace io
{
template<class I>
void gi(I &w)
{
int op=1;
char ch;
w=0;
while(!isdigit(ch))
{
if(ch=='-') op=-1;
ch=getchar();
}
while(isdigit(ch))
{
w=w*10+ch-'0';
ch=getchar();
}
w*=op;
}
}
using io::gi;
const int N=1e5+5;
int n,m,cnt;
int ind[N],oud[N],head[N];
ll val[N],divc[N];
queue<int>q;
struct edge
{
int to,nxt;
};
edge e[N*10];
ll gcd(ll x,ll y)
{
if(!y) return x;
return gcd(y,x%y);
}
void add_egde(int x,int y)
{
e[++cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
}
void merge(int x)
{
ll g=gcd(val[x],divc[x]);
val[x]/=g,divc[x]/=g;
}
int main()
{
freopen("water.in","r",stdin);
freopen("water.out","w",stdout);
gi(n),gi(m);
for(int i=1;i<=n;++i)
{
gi(oud[i]);
for(int j=1,x;j<=oud[i];++j)
{
gi(x);
++ind[x];
add_egde(i,x);
}
}
for(int i=1;i<=n;++i)
{
if(!ind[i]) q.push(i),val[i]=1;
divc[i]=1;
}
while(!q.empty())
{
int x=q.front();
q.pop();
if(!oud[x]) continue;
divc[x]*=oud[x];
merge(x);
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].to;
--ind[v];
val[v]=val[x]*divc[v]+val[v]*divc[x];
divc[v]=divc[v]*divc[x];
merge(v);
if(!ind[v]) q.push(v);
}
}
for(int i=1;i<=n;++i) if(!oud[i]) printf("%lld %lld\n",val[i],divc[i]);
return 0;
}