const mod = 1000000007;
const map_ =
new
Array(31).fill(0);
function
pow(n) {
let res = 1;
let m = 2;
while
(n !== 0) {
if
((n & 1) === 1) {
res = (res * m) % mod;
}
m = (m * m) % mod;
n >>= 1;
}
return
res;
}
function
check_prime_val() {
const prime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29];
for
(let i = 2; i <= 30; ++i) {
if
(i % 4 === 0 || i % 9 === 0 || i === 25) {
continue
;
}
let mask = 0;
for
(let j = 0; j < 10; ++j) {
if
(i % prime[j] === 0) {
mask |= 1 << j;
}
}
map_[i] = mask;
}
}
function
goodSubsets(arr, n) {
let one = 0;
const dp =
new
Array(1024).fill(0);
const cnt =
new
Array(31).fill(0);
dp[0] = 1;
for
(let i = 0; i < n; i++) {
if
(arr[i] === 1) {
one++;
}
else
if
(map_[arr[i]] !== 0) {
cnt[arr[i]]++;
}
}
for
(let i = 0; i < 31; ++i) {
if
(cnt[i] === 0) {
continue
;
}
for
(let j = 0; j < 1024; ++j) {
if
((j & map_[i]) !== 0) {
continue
;
}
dp[j | map_[i]] = (dp[j | map_[i]] + dp[j] * cnt[i]) % mod;
}
}
let res = 0;
for
(let i of dp) {
res = (res + i) % mod;
}
res--;
if
(one !== 0) {
res = (res * pow(one)) % mod;
}
return
res;
}
const arr = [1, 2, 3, 4];
const n = arr.length;
check_prime_val();
console.log(goodSubsets(arr, n));