OItiku 100,luogu 0pts
查看原帖
OItiku 100,luogu 0pts
115533
Locklink楼主2020/12/5 19:47

如题

#include<bits/stdc++.h>
#define ull unsigned long long
#define N 100005
#define dl cout<<"line"<<__LINE__<<endl
#define dbg(x) cout<<#x<<" : "<<(x)<<endl
using namespace std;
int n,m;
vector<int> G[N];
ull q[N],p[N];
int in[N];
bool out[N];
ull gcd(ull a,ull b){
  if(b==0)return a;
  return gcd(b,a%b);
}
inline ull lcm(ull a,ull b){
	return a/gcd(a,b)*b;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		q[i]=0;
		p[i]=1;
		int x;
		cin>>x;
		for(int j=0;j<x;j++){
			int c;
			cin>>c;
			G[i].push_back(c);
			in[c]++;
		}
	}
	for(int i=1;i<=m;i++)q[i]=1;
	vector<int> topo;
	queue<int> Q;
	for(int i=1;i<=m;i++){
		Q.push(i);
	}
	while(Q.size()){
		int u=Q.front();Q.pop();
		topo.push_back(u);
		for(int i=0;i<G[u].size();i++){
			in[G[u][i]]--;
			if(in[G[u][i]]==0){
				Q.push(G[u][i]);
			}
		}
	}
	for(int u=1;u<=n;u++){
		if(!G[u].size()){
			out[u]=true;
		}
		for(int i=0;i<G[u].size();i++){
			ull lc=lcm(p[G[u][i]],p[u]*G[u].size());
			q[G[u][i]]=lc/p[G[u][i]]*q[G[u][i]]+lc/(p[u]*G[u].size())*q[u];
			p[G[u][i]]=lc;
		}
	}
	for(int i=1;i<=n;i++){
		if(out[i]){
			cout<<q[i]/gcd(q[i],p[i])<<" "<<p[i]/gcd(q[i],p[i])<<endl;
		}
	}
	return 0;
}
2020/12/5 19:47
加载中...