#3539

Find Sum of Array Product of Magical Sequences

Hard
ArrayMathDynamic ProgrammingBit ManipulationCombinatoricsBitmaskDynamic ProgrammingBit Manipulation
LeetCode ↗

Approaches

Brute ForceOptimal
Complexity Comparison
Brute ForceOptimal Solution
Time
O(n^m)
O(m * k * n)
Space
O(1)
O(m * k)
💡

Intuition

Time O(m * k * n)Space O(m * k)

Use dynamic programming to build up solutions for sequences of increasing length while tracking the number of set bits.

⚙️

Algorithm

3 steps
  1. 1Step 1: Initialize a DP table dp[i][j][mask] to store the sum of products for sequences of length i with j set bits and the last used mask.
  2. 2Step 2: Iterate through each number and update the DP table based on previous states, ensuring the set bits count matches k.
  3. 3Step 3: Sum all valid products from the DP table where the sequence length is m and the set bits count is k.
solution.py12 lines
1def magical_sum(m, k, nums):
2    MOD = 10**9 + 7
3    dp = [[0] * (k + 1) for _ in range(m + 1)]
4    dp[0][0] = 1
5    for num in nums:
6        for i in range(m, 0, -1):
7            for j in range(k, -1, -1):
8                if dp[i-1][j] > 0:
9                    new_set_bits = bin(num).count('1')
10                    if j + new_set_bits <= k:
11                        dp[i][j + new_set_bits] = (dp[i][j + new_set_bits] + dp[i-1][j] * num) % MOD
12    return sum(dp[m][k]) % MOD

Complexity note: The complexity is driven by the nested loops over m, k, and n, leading to a polynomial time complexity.

  • 1Understanding bit manipulation is crucial for counting set bits.
  • 2Dynamic programming can significantly reduce the number of computations needed.

Solutions and explanations are original Tejav content. Problem titles © LeetCode — use the LeetCode button above for the full problem statement.