1
+ // Runtime: 369 ms (Top 88.27%) | Memory: 192.6 MB (Top 33.95%)
1
2
class Solution {
2
3
public:
3
-
4
+
4
5
#define lld long long int
5
-
6
+
6
7
int mul (lld a, lld b){
7
8
lld product = (a*b)%MOD;
8
9
return product;
9
10
}
10
-
11
+
11
12
int add (lld a, lld b){
12
13
lld addition = (a+b)%MOD;
13
14
return addition;
14
15
}
15
-
16
+
16
17
const int MOD = 1e9 +7 ;
17
18
int binary_exponentiation (lld x, int p){
18
19
long long res = 1 ;
@@ -23,69 +24,69 @@ class Solution {
23
24
}
24
25
return res;
25
26
}
26
-
27
+
27
28
int goodSubsets (int pos, int mask, vector<int >& V, vector<vector<int >>& dp, vector<int >& cache){
28
29
if (pos == V.size ()) return (mask>0 );
29
-
30
+
30
31
if (dp[pos][mask] != -1 ) return dp[pos][mask]%MOD;
31
-
32
+
32
33
if (V[pos]&mask) return dp[pos][mask] = goodSubsets (pos+1 , mask, V, dp, cache) % MOD;
33
34
return dp[pos][mask] = add (mul (cache[V[pos]],goodSubsets (pos+1 , mask|V[pos], V, dp, cache)),goodSubsets (pos+1 , mask, V, dp, cache));
34
35
}
35
-
36
+
36
37
int numberOfGoodSubsets (vector<int >& nums) {
37
-
38
+
38
39
int primes[10 ] = {2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 };
39
-
40
+
40
41
vector<int > V;
41
42
vector<int > cache (1025 , 0 );
42
-
43
+
43
44
int ones = 0 ;
44
-
45
+
45
46
for (auto x: nums){
46
-
47
+
47
48
int num = 0 , k=0 ;
48
49
int flag = 1 ;
49
-
50
+
50
51
for (auto j: primes){
51
52
52
53
int cnt = 0 ;
53
54
while (x%j == 0 ){
54
55
x/=j;
55
56
cnt++;
56
- if (cnt>1 ) break ;
57
+ if (cnt>1 ) break ;
57
58
}
58
-
59
+
59
60
if (cnt > 1 )
60
- {
61
+ {
61
62
flag = 0 ;
62
63
break ;
63
64
}
64
-
65
+
65
66
if (cnt == 1 )
66
67
num = num | (1 <<k);
67
-
68
+
68
69
++k;
69
70
}
70
-
71
+
71
72
if (flag == 0 ) continue ;
72
-
73
- if (num == 0 ) {
73
+
74
+ if (num == 0 ) {
74
75
ones++;
75
76
continue ;
76
77
}
77
-
78
+
78
79
cache[num]++;
79
80
if (cache[num] > 1 ) continue ;
80
-
81
+
81
82
V.push_back (num);
82
83
}
83
-
84
+
84
85
vector<vector<int >> dp (V.size (), vector<int > (1024 , -1 ));
85
-
86
+
86
87
int ans = goodSubsets (0 ,0 ,V,dp,cache);
87
88
ans = mul (binary_exponentiation (2 , ones),ans);
88
-
89
+
89
90
return ans;
90
91
}
91
- };
92
+ };
0 commit comments