这是改之前的代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 212345
int n,m,q,head[N],d[N],out[N],ans=1e8,cnt,x,y,in[N];
struct node{ int next,to; }e[N];
struct vv{ ll p,q;}v[N];
void add(int x,int y){
e[++cnt].to=y;
e[cnt].next=head[x];
in[y]++;out[x]++;
head[x]=cnt;
}
ll gcd(ll x,ll y){
if(y==0)return x;
else return gcd(y,x%y);
}
void jia(ll x,ll y){
ll mu=v[x].q*d[x];
ll zi=v[y].p*mu+v[x].p*v[y].q;
v[y].p=zi;v[y].q*=mu;
ll yue=gcd(v[y].p,v[y].q);
v[y].p/=yue,v[y].q/=yue;
// cout<<x<<' '<<y<<' '<<v[y].p<<' '<<v[y].q<<endl;
}
int main(){
// freopen("111.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&d[i]);
for(int j=1;j<=d[i];j++){
scanf("%d",&y);
add(i,y);
}
}
queue<int>q;
for(int i=1;i<=n;i++){
if(!in[i])q.push(i);
v[i].q=1;
if(i<=m)v[i].p=1;
}
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(--in[y]==0)q.push(y);
jia(x,y);
}
}
for(int i=1;i<=n;i++)
if(!out[i]){
ll yue=gcd(v[i].p,v[i].q);
cout<<v[i].p/yue<<' '<<v[i].q/yue<<endl;
}
return 0;
}
这是改之后的代码,不知道为什么会RE
#include<bits/stdc++.h>
using namespace std;
#define ll __int128
#define N 2123456
int n,m,q,head[N],d[N],out[N],ans=1e8,cnt,x,y,in[N];
struct node{ int next,to; }e[N];
struct vv{ ll p,q;}v[N];
ll read(){
ll f=1,x=0;char c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x>>3)+(x>>1)+c-'0',c=getchar();
return x*f;
}
void write(ll x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0') ;
}
void add(int x,int y){
e[++cnt].to=y;
e[cnt].next=head[x];
in[y]++;out[x]++;
head[x]=cnt;
}
ll gcd(ll x,ll y){
if(y==0)return x;
else return gcd(y,x%y);
}
void jia(ll x,ll y){
ll mu=v[x].q*d[x];
ll zi=v[y].p*mu+v[x].p*v[y].q;
v[y].p=zi;v[y].q*=mu;
ll yue=gcd(v[y].p,v[y].q);
v[y].p/=yue,v[y].q/=yue;
// cout<<x<<' '<<y<<' '<<v[y].p<<' '<<v[y].q<<endl;
}
int main(){
// freopen("111.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
d[i]=read();
for(int j=1;j<=d[i];j++)
y=read(),add(i,y);
}
queue<int>q;
for(int i=1;i<=n;i++){
if(!in[i])q.push(i);
v[i].q=1;
if(i<=m)v[i].p=1;
}
while(!q.empty()){
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next){
int y=e[i].to;
if(--in[y]==0)q.push(y);
jia(x,y);
}
}
for(int i=1;i<=n;i++)
if(!out[i]){
ll yue=gcd(v[i].p,v[i].q);
write(v[i].p/yue);putchar(' ');
write(v[i].q/yue);putchar(' ');
puts("");
}
return 0;
}