int128求助 !改之前longlong60分,改后re了
查看原帖
int128求助 !改之前longlong60分,改后re了
716721
leo12334楼主2023/11/7 10:24

这是改之前的代码

#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;
}

2023/11/7 10:24
加载中...