11package g3501_3600.s3539_find_sum_of_array_product_of_magical_sequences
22
33// #Hard #Array #Dynamic_Programming #Math #Bit_Manipulation #Bitmask #Combinatorics
4- // #2025_05_04_Time_58_ms_(_%)_Space_49.73_MB_(_ %)
4+ // #2025_05_06_Time_60_ms_(100.00%)_Space_48.98_MB_(100.00 %)
55
66class Solution {
7+ private val mod = 1000000007
8+ private val c: Array <IntArray > = precomputeBinom(31 )
9+ private val p: IntArray = precomputePop(31 )
10+
711 fun magicalSum (m : Int , k : Int , nums : IntArray ): Int {
812 val n = nums.size
913 val pow = Array <LongArray >(n) { LongArray (m + 1 ) }
1014 for (j in 0 .. < n) {
1115 pow[j][0 ] = 1L
1216 for (c in 1 .. m) {
13- pow[j][c] = pow[j][c - 1 ] * nums[j] % MOD
17+ pow[j][c] = pow[j][c - 1 ] * nums[j] % mod
1418 }
1519 }
1620 var dp = Array <Array <LongArray >>(m + 1 ) { Array <LongArray >(k + 1 ) { LongArray (m + 1 ) } }
@@ -38,12 +42,12 @@ class Solution {
3842 (
3943 next[t + cc][o + (total and 1 )][total ushr 1 ] +
4044 dp[t][o][c] *
41- C [m - t][cc] %
42- MOD
45+ this @Solution.c [m - t][cc] %
46+ mod
4347 * pow[i][cc] %
44- MOD
48+ mod
4549 ) %
46- MOD
50+ mod
4751 )
4852 }
4953 }
@@ -56,37 +60,31 @@ class Solution {
5660 var res: Long = 0
5761 for (o in 0 .. k) {
5862 for (c in 0 .. m) {
59- if (o + P [c] == k) {
60- res = (res + dp[m][o][c]) % MOD
63+ if (o + p [c] == k) {
64+ res = (res + dp[m][o][c]) % mod
6165 }
6266 }
6367 }
6468 return res.toInt()
6569 }
6670
67- companion object {
68- private const val MOD = 1000000007
69- private val C : Array <IntArray > = precomputeBinom(31 )
70- private val P : IntArray = precomputePop(31 )
71-
72- private fun precomputeBinom (max : Int ): Array <IntArray > {
73- val res = Array <IntArray >(max) { IntArray (max) }
74- for (i in 0 .. < max) {
75- res[i][i] = 1
76- res[i][0 ] = res[i][i]
77- for (j in 1 .. < i) {
78- res[i][j] = (res[i - 1 ][j - 1 ] + res[i - 1 ][j]) % MOD
79- }
71+ private fun precomputeBinom (max : Int ): Array <IntArray > {
72+ val res = Array <IntArray >(max) { IntArray (max) }
73+ for (i in 0 .. < max) {
74+ res[i][i] = 1
75+ res[i][0 ] = res[i][i]
76+ for (j in 1 .. < i) {
77+ res[i][j] = (res[i - 1 ][j - 1 ] + res[i - 1 ][j]) % mod
8078 }
81- return res
8279 }
80+ return res
81+ }
8382
84- private fun precomputePop (max : Int ): IntArray {
85- val res = IntArray (max)
86- for (i in 1 .. < max) {
87- res[i] = res[i shr 1 ] + (i and 1 )
88- }
89- return res
83+ private fun precomputePop (max : Int ): IntArray {
84+ val res = IntArray (max)
85+ for (i in 1 .. < max) {
86+ res[i] = res[i shr 1 ] + (i and 1 )
9087 }
88+ return res
9189 }
9290}
0 commit comments