用了int128,wa后四个点求调,玄关
查看原帖
用了int128,wa后四个点求调,玄关
1378344
sub_10楼主2024/12/6 22:00
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e6+7;
int n,m,a[N],ind[N],oud[N];
struct fenshu{
	__int128 zi=0,mu=0;
	fenshu(__int128 a=0,__int128 b=0){
		zi=a;
		mu=b;
	}
};
vector<int> e[N];
fenshu ans[N];
int lcm(int x,int y){
	return x*y/__gcd(x,y);
}
void add_edge(int i,int s){
	e[i].push_back(s);
	oud[i]++;
	ind[s]++;	
}
void push(fenshu &x){
	if(x.zi==0) return;
	__int128 f=__gcd(x.mu,x.zi);
	fenshu r=fenshu((x.zi/f),(x.mu/f));
	x=r;
}
fenshu tong(fenshu x,fenshu y){
	if(x.zi==0&&y.zi==0) return fenshu();
	if(x.zi==0||y.zi==0) return x.zi==0?y:x;
	int cm=lcm(x.mu,y.mu);
	int cz=cm/x.mu*x.zi+cm/y.mu*y.zi;
	fenshu fin={cz,cm};
	push(fin);
	return fin;
}
void topo(){
	queue<int> q;
	for(int i=1;i<=m;i++){	
		ans[i]=fenshu(1,1);
		q.push(i);
	}
	while(!q.empty()){
		int u=q.front();
		if(!oud[u]){
			q.pop();
			continue;
		}
		q.pop();
		int len=e[u].size();
		fenshu now=fenshu(ans[u].zi,len*ans[u].mu);
		push(now);
		ans[u]=fenshu(0,0);
		for(int v:e[u]){
			ans[v]=tong(ans[v],now);
			ind[v]--;
			if(!ind[v])
				q.push(v);
		}
	}
}
void print(__int128 x){
	if(x<0){
		x=-x;
		putchar('-');
	}
	if(x>9) print(x/10);
	putchar(x%10+'0');
}
signed main(){
//	ios_base::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	for(int i=1;i<=n;i++) ans[i]=fenshu();
	cin>>n>>m;
	for(int i=1,d;i<=n;i++){
		cin>>d;
		for(int j=1,s;j<=d;j++){
			cin>>s;
			add_edge(i,s);
		}  
	}
	topo();
	for(int i=1;i<=n;i++){
		if(!oud[i]){
			push(ans[i]);
			print(ans[i].zi);
			cout<<' ';
			print(ans[i].mu);
			cout<<'\n';
		}
	}
	return 0;
	
}
2024/12/6 22:00
加载中...