RT,虽然只开了LONGLONG,但已经爆内存了,高精度会不会更高
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int in[N],out[N],n,m;
vector<int> pai;
vector<int> ed[N];
queue<int> qu;
struct node{
long long p,q;
}sum[N];
long long my_gcd(long long a,long long b){
if(a < b) swap(a,b);
if(b == 0) return a;
return my_gcd(b,a % b);
}
node add(node A,node B){
long long d = my_gcd(A.q, B.q);
node C;
C.q = (A.q / d) * B.q;
C.p = A.p * (B.q / d) + B.p * (A.q / d);
return C;
}
void yue(node& A){
int d = my_gcd(A.p,A.q);
if(d == 0) return;
A.p /= d;
A.q /= d;
}
void down(int u){
if(out[u] == 0) return;
node temp;
temp.p = sum[u].p;
temp.q = sum[u].q * out[u] * 1ll;
yue(temp);
int len = ed[u].size();
for(int i = 0;i < len;i++){
sum[ed[u][i]] = add(sum[ed[u][i]],temp);
if(--in[ed[u][i]] == 0){
qu.push(ed[u][i]);
}
}
return;
}
int main(){
scanf("%d%d",&n,&m);
int d = 0, v = 0;
for(int i = 1;i <= n; i++){
sum[i].p = 0;
sum[i].q = 1;
scanf("%d",&d);
out[i] = d;
if(d == 0) pai.push_back(i);
for(int j = 1;j <= d;j++){
scanf("%d",&v);
ed[i].push_back(v);
++in[v];
}
}
for(int i = 1;i <= m;i++){
sum[i].p = 1;
sum[i].q = 1;
qu.push(i);
}
while(!qu.empty()){
int u = qu.front();
//printf("%d\n",u);
qu.pop();
down(u);
}
int len = pai.size();
for(int i = 0;i < len;i++){
yue(sum[pai[i]]);
printf("%lld %lld\n",sum[pai[i]].p,sum[pai[i]].q);
}
return 0;
}