import sys
import math
platforms = 0;
outs = [];
for line in sys.stdin:
row = [int(i)-1 for i in line.split(" ")];
outs.append(row);
platforms = outs.pop(0)[0];
for out in outs:
out.pop(0);
def normalize(rat):
n, d = rat;
common = math.gcd(n,d);
return (n//common,d//common);
def lcm(a,b):
return (a * b) // math.gcd(a,b)
def plus(rat1,rat2):
n1,d1 = rat1;
n2,d2 = rat2;
d = lcm(d1,d2);
return (n1*(d//d1)+n2*(d//d2),d);
def divide(rat,div):
n,d = rat;
return normalize((n,d*div));
distributions = [(1,1)] + [(0,1)]*platforms;
flows = [];
for idx, out in enumerate(outs):
if out:
fn,fd = divide(distributions[idx],len(out));
if fn > 0:
flows.append(fd);
for nxt in out:
distributions[nxt] = plus(distributions[nxt], (fn,fd));
result = 1;
for flow in flows:
result = lcm(result, flow);
print(result);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import sys import math platforms = 0; outs = []; for line in sys.stdin: row = [int(i)-1 for i in line.split(" ")]; outs.append(row); platforms = outs.pop(0)[0]; for out in outs: out.pop(0); def normalize(rat): n, d = rat; common = math.gcd(n,d); return (n//common,d//common); def lcm(a,b): return (a * b) // math.gcd(a,b) def plus(rat1,rat2): n1,d1 = rat1; n2,d2 = rat2; d = lcm(d1,d2); return (n1*(d//d1)+n2*(d//d2),d); def divide(rat,div): n,d = rat; return normalize((n,d*div)); distributions = [(1,1)] + [(0,1)]*platforms; flows = []; for idx, out in enumerate(outs): if out: fn,fd = divide(distributions[idx],len(out)); if fn > 0: flows.append(fd); for nxt in out: distributions[nxt] = plus(distributions[nxt], (fn,fd)); result = 1; for flow in flows: result = lcm(result, flow); print(result); |
English