80分求助,貌似是分数加法时的精度问)
查看原帖
80分求助,貌似是分数加法时的精度问)
389540
imfkwk楼主2020/12/11 18:32
#include <bits/stdc++.h>
using namespace std;
int n,m,x,y;
vector<int>t[100005];
unsigned long long fz[100005];
unsigned long long fm[100005];
int rd[100005];
unsigned long long ffz,ffm;
unsigned long long cj;
queue<int>q;
int s;
bool f[100005];
unsigned long long e,w;
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)fm[i]=1;
	for(int i=1;i<=n;i++){
		cin>>x;
		if(x==0)f[i]=1;
		for(int j=1;j<=x;j++){
			cin>>y;
			rd[y]++;
			t[i].push_back(y);
		}
	}
	for(int i=1;i<=m;i++)fz[i]=1;
	for(int i=1;i<=n;i++)
	if(rd[i]==0)q.push(i);
	while(!q.empty()){
		s=q.front();
		q.pop();
		ffz=fz[s];
		ffm=fm[s]*t[s].size();
		for(int i=0;i<t[s].size();i++){
			
			e=fz[t[s][i]];
			w=fm[t[s][i]];
			
			cj=w/__gcd(ffm,w);
			cj*=ffm;
			e*=cj/w;
			e+=ffz*cj/ffm;
			w=cj;
			cj=__gcd(e,w);
			e/=cj;
			w/=cj;
			
			fz[t[s][i]]=e;
			fm[t[s][i]]=w;
			
			rd[t[s][i]]--;
			if(rd[t[s][i]]==0)q.push(t[s][i]);
		}
	}
	for(int i=1;i<=n;i++){
		if(f[i]){
			cout<<fz[i]<<" "<<fm[i];
			cout<<endl;
		}
	}
	return 0;
}```
的确是加一次约一次,求lcm的时候也是先除后乘的()
2020/12/11 18:32
加载中...