Title Description
For a city, drainage system is an extremely important part.
One day, little C got the design drawing of a city's drainage system. The drainage system consists of nn Drainage nodes (they are from 1 \sim n1∼n Number) and several one-way drainage pipes. Each drainage node has several pipelines for collecting the sewage of other drainage nodes (hereinafter referred to as the collection pipeline of the node), and several pipelines also discharge the sewage to other drainage nodes (hereinafter referred to as the discharge pipeline of the node).
The nodes of the drainage system are mm There are two sewage receiving ports, and their numbers are 1, 2, \ ldots, M1, 2,..., m, sewage can only flow into the drainage system from these receiving ports, and there is no collecting pipe at these nodes. There are several final outlets in the drainage system, which transport the sewage to the sewage treatment plant. The node without discharge pipeline can be regarded as a final outlet.
Now each sewage receiving port receives sewage separately eleven Tons of sewage. After entering each node, the sewage will flow equally from each discharge pipe of the current node to other drainage nodes, and the final outlet will discharge the sewage into the system.
Now little C wants to know how much sewage will be discharged from each final outlet in the city's drainage system. The drainage system of the city is designed scientifically, and the pipeline will not form a loop, that is, the sewage will not form a circulation.
Input format
The first two integers separated by a single space n, mn,m. Indicates the number of drainage nodes and the number of receiving ports respectively.
next nn OK, No ii Lines are used to describe nodes ii All discharge pipes. Where the first integer in each line d_idi Indicates the number of discharge pipes, and then d_idi An integer separated by a single space a_1, a_2, \ldots , a_a1,a2,…,adi Represent the target drainage node of the pipeline in turn.
Ensure that there will not be two pipes with the same starting node and target node.
Output format
Output several lines and give the volume of sewage discharged from each final outlet in the order of number from small to large. The volume is output in fractional form, that is, two integers separated by a single space are output per line PP, QQ, indicating that the volume of discharged sewage is \ fracqp. requirement pp And qq Coprime, q = 1q=1 Output is also required qq.
Input and output samples
Enter #1 copy
5 1 3 2 3 5 2 4 5 2 5 4 0 0Output #1 copy
1 3 2 3The code is as follows. I passed 90 points in Luogu. The last one should be because the unsigned long range burst when passing the points. Readers have optimized full marks or ideas for my code. Welcome to write to me privately. Thank you for your support.
My code uses DFS. The first time I wrote the code for an hour and a half, I passed 7 points and got 80 points. Later, I made a big optimization. All kinds of high precision and small skills were used, and finally got 90 points. The code I passed for the first time is also attached below.
90 Point Code:#include<cstdio> #include<cstring> int map[100005][7]; int ru[100005]; unsigned long long n,m,x,y,xia,shang,kuoa,kuob,r,rr,res,left,right; struct fenshu{ unsigned long long x; unsigned long long y; fenshu(){ x=0; y=0; } //It seems to be the standard of c99 }; fenshu qingkong; fenshu num[100005]; //All defined variables inline unsigned long long read(){ char c; int f=1; res=0; c=getchar(); while(c<'0' || c>'9')c=getchar(); while(c>='0' && c<='9'){ res=(res<<1)+(res<<3)+(c^48); c=getchar(); } return res; } inline unsigned long long gcd(unsigned long long a,unsigned long long b) { if(b==0) return a; return gcd(b,a%b); } inline fenshu jia(fenshu a,fenshu b){ fenshu nnn; if(b.x==0 || b.y==0){ xia=a.y; shang=a.x; } else if(a.y==b.y){ shang=a.x+b.x; xia=a.y; r=gcd(xia,shang); shang=shang/r; xia=xia/r; } else{ rr=gcd(a.y,b.y); kuoa=b.y/rr; kuob=a.y/rr; shang=(kuoa*a.x+kuob*b.x); //Optimization should be done here, otherwise the same branch will cross the unsigned long long boundary r=gcd(a.y,rr); left=a.y/r; rr=rr/r; r=gcd(b.y,rr); right=b.y/r; rr=rr/r; if(left%rr==0){ left=left/rr; xia=left*right; } else if(right%rr==0){ right=right/rr; xia=left*right; } else xia=(left*right)/rr; r=gcd(xia,shang); if(r!=1){ xia=xia/r; shang=shang/r; } } nnn.x=shang; nnn.y=xia; return nnn; } inline fenshu fen(fenshu goal,unsigned long long piece){ if(piece==1){ return goal; } else{ fenshu nn; rr=gcd(goal.x,piece); if(rr!=1){ nn.x=goal.x/rr; piece=piece/rr; } else{ nn.x=goal.x; } nn.y=goal.y*piece; r=gcd(nn.x,nn.y); if(r!=1){ nn.x=nn.x/r; nn.y=nn.y/r; } return nn; } } inline void add_dfs(int start){ if(map[start][0]==0)return; fenshu fen_num; fen_num=fen(num[start],map[start][0]); for(int i=1;i<=map[start][0];i++){ num[map[start][i]]=jia(fen_num,num[map[start][i]]); add_dfs(map[start][i]); num[start]=qingkong; } } signed main(){ freopen("rr.ii","r",stdin); freopen("rr.out","w",stdout); qingkong.x=0; qingkong.y=0; memset(map,0,sizeof(map)); memset(ru,0,sizeof(ru)); n=read();m=read(); for(int i=1;i<=n;i++){ x=read(); for(int ii=1;ii<=x;ii++){ //If 0, return y=read(); ru[y]++; map[i][0]++; map[i][map[i][0]]=y; } } for(int i=1;i<=n;i++){ if(ru[i]==0){ num[i].x=1; num[i].y=1; add_dfs(i); } } for(int i=1;i<=n;i++) if(map[i][0]==0) printf("%llu %llu\n",num[i].x,num[i].y); //Note format return 0; }
The test data are as follows
First Code(80)
#include<cstdio> #include<cstring> int map[100005][7]; int ru[100005]; struct fenshu{ unsigned long long x; unsigned long long y; fenshu(){ x=0; y=0; } }; fenshu qingkong; fenshu num[100005]; inline unsigned long long read(){ char c; int f=1; long long res=0; c=getchar(); while(c<'0' || c>'9')c=getchar(); while(c>='0' && c<='9'){ res=(res<<1)+(res<<3)+(c^48); c=getchar(); } return res; } inline long long gcd(unsigned long long a,unsigned long long b) { if(b==0) return a; return gcd(b,a%b); } inline fenshu jia(fenshu a,fenshu b){ fenshu nnn; unsigned long long r; unsigned long long xia; unsigned long long shang; if(b.x==0 || b.y==0){ xia=a.y; shang=a.x; } else{ xia=(a.y*b.y); shang=(a.x*b.y+a.y*b.x); r=gcd(xia,shang); if(r!=1 && r!=0){ xia=xia/r; shang=shang/r; } } nnn.x=shang; nnn.y=xia; return nnn; } inline fenshu fen(fenshu goal,long long piece){ fenshu nn; if(piece==1){ return goal; } else{ nn.x=goal.x; nn.y=goal.y*piece; unsigned long long r=gcd(nn.x,nn.y); if(r!=1 && r!=0){ nn.x=nn.x/r; nn.y=nn.y/r; } } return nn; } inline void add_dfs(int start){ if(map[start][0]==0)return; fenshu fen_num; fen_num=fen(num[start],map[start][0]); for(int i=1;i<=map[start][0];i++){ num[map[start][i]]=jia(fen_num,num[map[start][i]]); add_dfs(map[start][i]); num[start]=qingkong; } } signed main(){ qingkong.x=0; qingkong.y=0; memset(map,0,sizeof(map)); memset(ru,0,sizeof(ru)); unsigned long long n,m,x,y; n=read(); m=read(); for(int i=1;i<=n;i++){ x=read(); for(int ii=1;ii<=x;ii++){ //If 0, return y=read(); ru[y]++; map[i][0]++; map[i][map[i][0]]=y; } } for(int i=1;i<=n;i++){ if(ru[i]==0){ num[i].x=1; num[i].y=1; add_dfs(i); } } for(int i=1;i<=n;i++){ if(map[i][0]==0){ printf("%lld %lld\n",num[i].x,num[i].y); } } return 0; }