我这个程序测试就只AC了6个,但是排除掉我没有用高精度~~(好吧其实是我嫌麻烦懒得打,后面再加上去)~~,我想问下,别的大佬说long long能弄到90分,为啥我才60呀,是哪里有问题吗!!!
#include<bits/stdc++.h>
using namespace std;
struct fs{
long long up=0;
long long down=1;
};
long long n,m;
fs ans[100001];
fs js;
struct zhan{
long long in=0;
long long PLN; //Pipe Lines number;
long long firstare[5]={0};
long long off=1;
};
zhan tp[100001];
int gys(long long UP,long long DOWN){
if(UP%DOWN==0){
return DOWN;
}
return gys(DOWN,UP%DOWN);
}
void add(struct fs a,struct fs fir,long long I,long long J){
if(a.down==fir.down){
ans[tp[I].firstare[J]-1].up=a.up+fir.up;
long long GYS=gys(ans[tp[I].firstare[J]-1].up,ans[tp[I].firstare[J]-1].down);
ans[tp[I].firstare[J]-1].up/=GYS;
ans[tp[I].firstare[J]-1].down/=GYS;
return;
}else{
fs zc;
zc.up=fir.up;
zc.down=fir.down;
ans[tp[I].firstare[J]-1].up=zc.up*a.down+zc.down*a.up;
ans[tp[I].firstare[J]-1].down=zc.down*a.down;
long long gcd=gys(ans[tp[I].firstare[J]-1].up,ans[tp[I].firstare[J]-1].down);
ans[tp[I].firstare[J]-1].up/=gcd;
ans[tp[I].firstare[J]-1].down/=gcd;
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
long long point;
cin>>point;
tp[i].PLN=point;
//cout<<" "<<i<<" "<<endl;
for(int j=0;j<point;j++){
int out;
cin>>out;
tp[out-1].in++;//
tp[i].firstare[j]=out;
}
}
long long CBW=n;
//js.up=1;
for(long long i=0;i<n;i++){
if(tp[i].in==0){
ans[i].up=1;
}
}
for(int i=0;i<n&&CBW!=0;i++){
if((tp[i].in==0)&&(tp[i].off==1)){
if(tp[i].firstare[0]==0){
CBW--;
tp[i].off--;
continue;
}
tp[i].off--;
for(long long j=0;j<tp[i].PLN;j++){
js.up=ans[i].up;
js.down=ans[i].down*tp[i].PLN;
add(js,ans[tp[i].firstare[j]-1],i,j);
if(tp[tp[i].firstare[j]-1].in!=0)
tp[tp[i].firstare[j]-1].in--;
}
CBW--;
}
if(i==n-1){
if(CBW!=0){
i=0;
}
else break;
}
}
for(int i=0;i<n;i++){
if(tp[i].PLN==0)
cout<<ans[i].up<<" "<<ans[i].down<<endl;
}
return 0;
}