30分,没用ull也不至于这么低吧
查看原帖
30分,没用ull也不至于这么低吧
89644
Harry_hcx楼主2020/12/17 20:49

RT,30分,求助

#include<bits/stdc++.h>
using namespace std;
struct tnum{
	long long fenzi,fenmu;
}water[100002];
long long n,m,d[100002][7];
bool can[100002];
queue<int>q;
long long gcd(long long a,long long b){
	if (a<b) swap(a,b);
	long long n=a%b;
	while (n!=0){
		a=b;b=n;n=a%b;
	}
	return b;
}
tnum plu(tnum a,tnum b){
	long long c=gcd(a.fenmu,b.fenmu);
	c=(a.fenmu/c)*(b.fenmu/c)*c;
	tnum wait;
	wait.fenmu=c;
	wait.fenzi=(a.fenzi*(c/a.fenmu))+(b.fenzi*(c/b.fenmu));
//	cout<<wait.fenmu<<' '<<wait.fenzi<<endl;
	c=gcd(wait.fenmu,wait.fenzi);
	wait.fenmu=wait.fenmu/c;wait.fenzi=wait.fenzi/c;
	return wait;
}
int main(){
	freopen("water.in","r",stdin);
	freopen("water.out","w",stdout);
	scanf("%lld %lld",&n,&m);
	for (int i=1;i<=n;i++){
		scanf("%lld",&d[i][0]);
		for (int j=1;j<=d[i][0];j++)
			scanf("%lld",&d[i][j]);
	}
	for (int i=1;i<=m;i++){
		water[i].fenzi=1;water[i].fenmu=1;
		q.push(i);
	}
	for (int i=1;i<=n;i++)
		water[i].fenmu=1;
	while(!q.empty()){
		tnum dww;
		int head=q.front();
		dww.fenmu=water[head].fenmu*d[head][0];
		dww.fenzi=water[head].fenzi;
		for (int i=1;i<=d[head][0];i++){
			water[d[head][i]]=plu(water[d[head][i]],dww);
//			if (d[head][i]==741)
//				cout<<water[d[head][i]].fenzi<<' '<<water[d[head][i]].fenmu<<endl;
			if (!can[d[head][i]]){
				q.push(d[head][i]);
				can[d[head][i]]=true;
			}
		}
		q.pop();
	}
	for (int i=1;i<=n;i++){
		if (d[i][0]==0)
			printf("%lld %lld\n",water[i].fenzi,water[i].fenmu);
//		if (water[i].fenzi==169&&water[i].fenmu==15000){
//			cout<<"cnmd"<<i<<endl;
//			return 0;
//		}
	}
	return 0;
}
2020/12/17 20:49
加载中...