求助
查看原帖
求助
809708
whssy楼主2023/7/11 12:27
#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline void inr(T &x){
	char c=getchar();bool f=0;
	while (c<'0'||c>'9') {
		if (c=='-') f=1;
		c=getchar();
	}
	for (x=0;c>='0'&&c<='9';c=getchar())
		x=(x<<3)+(x<<1)+(c&15);
	x=f?-x:x;
}
template<typename T>
inline void outw(T x){
	if(x<0) putchar('-'),x=-x;
	if(x/10) outw(x/10);
	putchar((x%10)|48);
}
struct number{
	__int128 numerator,denominator;
};
__int128 gcd(__int128 x,__int128 y){
	if(y==0) return x;
	return gcd(y,x%y);
}
number jia(number x,number y){
	number temp;
	temp.denominator=x.denominator*y.denominator;
	temp.numerator=x.numerator*y.denominator+y.numerator*x.denominator;
	__int128 tgcd=gcd(temp.numerator,temp.denominator);
	temp.numerator/=tgcd;
	temp.denominator/=tgcd;
}
number chu(number x,int y){
	number temp;
	temp.denominator*=y;
	__int128 tgcd=gcd(temp.numerator,temp.denominator);
	temp.numerator/=tgcd;
	temp.denominator/=tgcd;
}
const int N=1e5+5;
int n,m;
vector<int> ve[N];
int in[N],out[N];
number dis[N];
void top_sort(){
	queue<int>q;
	for(int i=1;i<=m;i++)
		q.push(i),dis[i].numerator=dis[i].denominator=1;
	for(int i=m+1;i<=n;i++)
		dis[i].denominator=1;
	while(!q.empty()){
		int u=q.front();
		q.pop();
		int len=ve[u].size();
		for(int v:ve[u]){
			in[v]--;
			dis[v]=jia(dis[v],chu(dis[u],len));
			if(!in[v]) q.push(v);
		}
	}
}
int main(){
	inr(n);inr(m);
	for(int i=1;i<=n;i++){
		int d;
		inr(d);
		out[i]=d;
		for(int j=1;j<=d;j++){
			int v;
			inr(v);
			ve[i].emplace_back(v);
			in[v]++;
		}
	}
	top_sort();
	for(int i=1;i<=n;i++)
		if(!out[i]){
			outw(dis[i].numerator);
			putchar(' ');
			outw(dis[i].denominator);
			putchar('\n');
		}
	return 0;
}
2023/7/11 12:27
加载中...