from math import gcd n = int(input()) nxt = [list(map(lambda x : int(x) - 1, input().split()))[1::] for i in range(n)] prv = [[] for i in range(n)] for x in range(n): for y in nxt[x]: prv[y].append(x) dp_t, dp_cnt = [1] * n, [0] * n dp_t[0] = max(1, len(nxt[0])) dp_cnt[0] = dp_t[0] for x in range(1, n): dp_t[x] = dp_t[x - 1] suitcases_t = 0 for y in prv[x]: suitcases_t += dp_cnt[y] * dp_t[x - 1] // (dp_t[y] * len(nxt[y])) if suitcases_t > 0 and len(nxt[x]) > 0: if len(nxt[x]) == 0: dp_cnt[x] = suitcases_t else: k = len(nxt[x]) // gcd(suitcases_t, len(nxt[x])) dp_t[x] *= k dp_cnt[x] = suitcases_t * k print(dp_t[n - 1])
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | from math import gcd n = int(input()) nxt = [list(map(lambda x : int(x) - 1, input().split()))[1::] for i in range(n)] prv = [[] for i in range(n)] for x in range(n): for y in nxt[x]: prv[y].append(x) dp_t, dp_cnt = [1] * n, [0] * n dp_t[0] = max(1, len(nxt[0])) dp_cnt[0] = dp_t[0] for x in range(1, n): dp_t[x] = dp_t[x - 1] suitcases_t = 0 for y in prv[x]: suitcases_t += dp_cnt[y] * dp_t[x - 1] // (dp_t[y] * len(nxt[y])) if suitcases_t > 0 and len(nxt[x]) > 0: if len(nxt[x]) == 0: dp_cnt[x] = suitcases_t else: k = len(nxt[x]) // gcd(suitcases_t, len(nxt[x])) dp_t[x] *= k dp_cnt[x] = suitcases_t * k print(dp_t[n - 1]) |