Skip to content

Commit 096ec02

Browse files
authored
Create count-ways-to-make-array-with-product.py
1 parent 3639aff commit 096ec02

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Time: O(nlogn)
2+
# Space: O(logn)
3+
4+
import collections
5+
6+
7+
MAX_N = 10**4
8+
MOD = 10**9+7
9+
MAX_F = MAX_N.bit_length()-1 # floor_log2_MAX_N
10+
fact = [0]*((MAX_F+MAX_N-1)+1)
11+
inv = [0]*((MAX_F+MAX_N-1)+1)
12+
inv_fact = [0]*((MAX_F+MAX_N-1)+1)
13+
fact[0] = inv_fact[0] = fact[1] = inv_fact[1] = inv[1] = 1
14+
for i in xrange(2, len(fact)):
15+
fact[i] = fact[i-1]*i % MOD
16+
inv[i] = inv[MOD%i]*(MOD-MOD//i) % MOD # https://cp-algorithms.com/algebra/module-inverse.html
17+
inv_fact[i] = inv_fact[i-1]*inv[i] % MOD
18+
19+
sieve = range(MAX_N+1)
20+
for i in xrange(2, MAX_N+1):
21+
if sieve[i] != i:
22+
continue
23+
for j in xrange(i*i, MAX_N+1, i):
24+
sieve[j] = i
25+
26+
class Solution(object):
27+
def waysToFillArray(self, queries):
28+
"""
29+
:type queries: List[List[int]]
30+
:rtype: List[int]
31+
"""
32+
def nCr(n, k, mod):
33+
return (fact[n]*inv_fact[n-k] % mod) * inv_fact[k] % mod
34+
35+
def get_factors(k):
36+
factors = collections.Counter()
37+
while k > 1:
38+
factors[sieve[k]] += 1
39+
k //= sieve[k]
40+
return factors
41+
42+
result = []
43+
for n, k in queries:
44+
factors = get_factors(k)
45+
curr = 1
46+
for f in factors.itervalues():
47+
curr *= nCr(f+n-1,f, MOD) # H(n, f)
48+
result.append(curr % MOD)
49+
return result

0 commit comments

Comments
 (0)