Skip to content

Commit af7217c

Browse files
authored
Update number-of-sets-of-k-non-overlapping-line-segments.py
1 parent 2bbd8e5 commit af7217c

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

Python/number-of-sets-of-k-non-overlapping-line-segments.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,41 @@
1-
# Time: O(min(k, min(n - k)))
2-
# Space: O(1)
1+
# Time: O(1), excluding precomputation time
2+
# Space: O(n)
33

44
class Solution(object):
5+
def __init__(self):
6+
MOD = 10**9+7
7+
MAX_N = 1000
8+
self.__fact = [0]*(2*MAX_N-1+1)
9+
self.__inv = [0]*(2*MAX_N-1+1)
10+
self.__inv_fact = [0]*(2*MAX_N-1+1)
11+
self.__fact[0] = self.__inv_fact[0] = self.__fact[1] = self.__inv_fact[1] = self.__inv[1] = 1
12+
for i in xrange(2, len(self.__fact)):
13+
self.__fact[i] = self.__fact[i-1]*i % MOD
14+
self.__inv[i] = self.__inv[MOD%i]*(MOD-MOD//i) % MOD # https://cp-algorithms.com/algebra/module-inverse.html
15+
self.__inv_fact[i] = self.__inv_fact[i-1]*self.__inv[i] % MOD
16+
17+
def numberOfSets(self, n, k):
18+
"""
19+
:type n: int
20+
:type k: int
21+
:rtype: int
22+
"""
23+
MOD = 10**9+7
24+
def nCr(n, k, mod):
25+
return (self.__fact[n]*self.__inv_fact[n-k] % mod) * self.__inv_fact[k] % mod
26+
27+
# find k segments with 1+ length and (k+1) spaces with 0+ length s.t. total length is n-1
28+
# => find k segments with 0+ length and (k+1) spaces with 0+ length s.t. total length is n-k-1
29+
# => find the number of combinations of 2k+1 variables with total sum n-k-1
30+
# => H(2k+1, n-k-1)
31+
# => C((2k+1) + (n-k-1) - 1, n-k-1)
32+
# => C(n+k-1, n-k-1) = C(n+k-1, 2k)
33+
return nCr(n+k-1, 2*k, MOD)
34+
35+
36+
# Time: O(min(k, min(n - k)))
37+
# Space: O(1)
38+
class Solution2(object):
539
def numberOfSets(self, n, k):
640
"""
741
:type n: int

0 commit comments

Comments
 (0)