LeetCode 1735. Count Ways to Make Array With Product Solution in Java, C++, Python & Go | Explanation + Code

CoderIndeed
0
1735. Count Ways to Make Array With Product

Description

You are given a 2D integer array, queries. For each queries[i], where queries[i] = [ni, ki], find the number of different ways you can place positive integers into an array of size ni such that the product of the integers is ki. As the number of ways may be too large, the answer to the ith query is the number of ways modulo 109 + 7.

Return an integer array answer where answer.length == queries.length, and answer[i] is the answer to the ith query.

 

Example 1:

Input: queries = [[2,6],[5,1],[73,660]]
Output: [4,1,50734910]
Explanation: Each query is independent.
[2,6]: There are 4 ways to fill an array of size 2 that multiply to 6: [1,6], [2,3], [3,2], [6,1].
[5,1]: There is 1 way to fill an array of size 5 that multiply to 1: [1,1,1,1,1].
[73,660]: There are 1050734917 ways to fill an array of size 73 that multiply to 660. 1050734917 modulo 109 + 7 = 50734910.

Example 2:

Input: queries = [[1,1],[2,2],[3,3],[4,4],[5,5]]
Output: [1,2,3,10,5]

 

Constraints:

  • 1 <= queries.length <= 104
  • 1 <= ni, ki <= 104

Solutions

Solution 1: Prime Factorization + Combinatorial Mathematics

We can perform prime factorization on k, i.e., k = p1^{x1} × p2^{x2} × … × pm^{xm}, where pi is a prime number, and xi is the exponent of pi. The problem is equivalent to: placing x1 p1s, x2 p2s, , xm pms into n positions respectively, where a single position can be empty. The question is how many schemes are there.

According to combinatorial mathematics, there are two cases when we put x balls into n boxes:

If the box cannot be empty, the number of schemes is Cx-1^{n-1}. This is using the partition method, i.e., there are a total of x balls, and we insert n-1 partitions at x-1 positions, thereby dividing the x balls into n groups.

If the box can be empty, we can add n virtual balls, and then use the partition method, i.e., there are a total of x+n balls, and we insert n-1 partitions at x+n-1 positions, thereby dividing the actual x balls into n groups and allowing the box to be empty. Therefore, the number of schemes is Cx+n-1^{n-1}.

Therefore, for each query queries[i], we can first perform prime factorization on k to get the exponents x1, x2, …, xm, then calculate Cx1+n-1^{n-1}, Cx2+n-1^{n-1}, …, Cxm+n-1^{n-1}, and finally multiply all the scheme numbers.

So, the problem is transformed into how to quickly calculate Cm^n. According to the formula Cm^n = m!n!(m-n)!, we can pre-process m!, and then use the inverse element to quickly calculate Cm^n.

The time complexity is O(K × log log K + N + m × log K), and the space complexity is O(N).

PythonJavaC++Go
N = 10020 MOD = 10**9 + 7 f = [1] * N g = [1] * N p = defaultdict(list) for i in range(1, N): f[i] = f[i - 1] * i % MOD g[i] = pow(f[i], MOD - 2, MOD) x = i j = 2 while j <= x // j: if x % j == 0: cnt = 0 while x % j == 0: cnt += 1 x //= j p[i].append(cnt) j += 1 if x > 1: p[i].append(1) def comb(n, k): return f[n] * g[k] * g[n - k] % MOD class Solution: def waysToFillArray(self, queries: List[List[int]]) -> List[int]: ans = [] for n, k in queries: t = 1 for x in p[k]: t = t * comb(x + n - 1, n - 1) % MOD ans.append(t) return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !