Skip to content

Commit bf53c5c

Browse files
authored
Update 1994-the-number-of-good-subsets.js
1 parent 8c0ff0c commit bf53c5c

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

1994-the-number-of-good-subsets.js

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,70 @@
1+
const primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
2+
const M = 1e9 + 7
3+
/**
4+
* @param {number[]} nums
5+
* @return {number}
6+
*/
7+
var numberOfGoodSubsets = function (nums) {
8+
const n = primes.length
9+
const dp = new Array(1 << n).fill(0)
10+
dp[0] = 1
11+
12+
const map = new Map()
13+
for (const x of nums) {
14+
map.set(x, (map.get(x) || 0) + 1)
15+
}
16+
17+
let count1 = 0
18+
for (const [x, count] of map) {
19+
if (x === 1) continue
20+
const encode = encoding(x)
21+
if (encode === -1) continue
22+
23+
for (let state = (1 << n) - 1; state >= 1; state--) {
24+
if (state - encode === (state ^ encode)) {
25+
dp[state] = (dp[state] + ((dp[state - encode] * count) % M)) % M
26+
}
27+
}
28+
}
29+
30+
let ret = 0
31+
for (let state = 1; state < 1 << n; state++) {
32+
ret = (ret + dp[state]) % M
33+
}
34+
35+
let power2 = 1
36+
for (let i = 0; i < (map.get(1) || 0); i++) {
37+
power2 = (power2 * 2) % M
38+
}
39+
40+
return mul(ret, power2)
41+
}
42+
43+
function mul(...arr) {
44+
let res = 1n
45+
for (const e of arr) {
46+
res *= BigInt(e)
47+
}
48+
49+
return Number(res % BigInt(M))
50+
}
51+
52+
function encoding(num) {
53+
let encode = 0
54+
for (let i = 0; i < primes.length; i++) {
55+
if (num % primes[i] === 0) {
56+
encode += 1 << i
57+
num /= primes[i]
58+
}
59+
if (num % primes[i] === 0) {
60+
return -1
61+
}
62+
}
63+
return encode
64+
}
65+
66+
// another
67+
168
const M = 1e9 + 7
269

370
/**

0 commit comments

Comments
 (0)