Skip to content

Commit aeb3ed1

Browse files
authored
Create count-ways-to-build-rooms-in-an-ant-colony.py
1 parent 757a2ea commit aeb3ed1

File tree

1 file changed

+32
-0
lines changed

1 file changed

+32
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Time: O(n)
2+
# Space: O(n)
3+
4+
class Solution(object):
5+
def waysToBuildRooms(self, prevRoom):
6+
"""
7+
:type prevRoom: List[int]
8+
:rtype: int
9+
"""
10+
MOD = 10**9+7
11+
fact = [1, 1]
12+
inv = [0, 1]
13+
inv_fact = [1, 1]
14+
def nCr(n, k):
15+
while len(inv) <= n: # lazy initialization
16+
fact.append(fact[-1]*len(inv) % MOD)
17+
inv.append(inv[MOD%len(inv)]*(MOD-MOD//len(inv)) % MOD) # https://cp-algorithms.com/algebra/module-inverse.html
18+
inv_fact.append(inv_fact[-1]*inv[-1] % MOD)
19+
return (fact[n]*inv_fact[n-k] % MOD) * inv_fact[k] % MOD
20+
21+
def dfs(adj, curr):
22+
total_ways, total_cnt = 1, 0
23+
for child in adj[curr]:
24+
ways, cnt = dfs(adj, child)
25+
total_cnt += cnt
26+
total_ways = (((total_ways*ways) % MOD)*nCr(total_cnt, cnt)) % MOD
27+
return total_ways, total_cnt+1
28+
29+
adj = [[] for _ in xrange(len(prevRoom))]
30+
for i in xrange(1, len(prevRoom)):
31+
adj[prevRoom[i]].append(i)
32+
return dfs(adj, 0)[0]

0 commit comments

Comments
 (0)