#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 + 5;
const int MAX_A = 70;
const int MOD = 1e9 + 7;
int prime[19] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67};
void add(int& a, int b) {
a += b;
if (a >= MOD) a -= MOD;
if (a < 0) a += MOD;
}
int binpow(int a, int b) {
int ans = 1;
for (; b > 0; b >>= 1) {
if (b & 1) ans = 1ll * ans * a % MOD;
a = 1ll * a * a % MOD;
}
return ans;
}
int n;
int a[N];
int cnt[MAX_A + 5]; // cnt[x] = số lần xuất hiện của giá trị x
// mask đại diện cho tính chẵn lẻ của các số mũ của một tập hợp số nguyên tố, trong đó:
// bit thứ i là 1: số nguyên tố thứ i xuất hiện lẻ lần hay có số mũ lẻ
// bit thứ i là 0: số nguyên tố thứ i xuất hiện chẵn lần hay có số mũ chẵn
int prime_mask[MAX_A + 5]; // prime_mask[x] = mask tương ứng với tập ước nguyên tố của x
int dp[MAX_A + 5][1 << 19]; // dp[x][mask] = Số tập hợp khác nhau khi xét các giá trị từ 1 đến x,
// với mask tương ứng với tập ước nguyên tố của tích của tập hợp
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
cnt[a[i]]++;
}
for (int x = 1; x <= MAX_A; x++) {
int tmp = x;
for (int i = 0; i < 19; i++) {
int e = 0;
while (tmp % prime[i] == 0) {
tmp /= prime[i];
e += 1;
}
if (e & 1) prime_mask[x] |= (1 << i);
}
}
dp[0][0] = 1;
for (int x = 0; x < MAX_A; x++) {
for (int mask = 0; mask < (1 << 19); mask++) {
if (dp[x][mask] == 0) continue;
if (cnt[x + 1] == 0) {
add(dp[x + 1][mask], dp[x][mask]);
}
else {
// thêm vào tập hợp hiện tại chẵn phần tử có giá trị là x + 1
add(dp[x + 1][mask], 1ll * dp[x][mask] * binpow(2, cnt[x + 1] - 1) % MOD);
// thêm vào tập hợp hiện tại lẻ phần tử có giá trị là x + 1
add(dp[x + 1][mask ^ prime_mask[x + 1]], 1ll * dp[x][mask] * binpow(2, cnt[x + 1] - 1) % MOD);
}
}
}
int ans = dp[MAX_A][0];
add(ans, -1); // trừ đi trường hợp tập rỗng
cout << ans << '\n';
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IAoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsgIAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7ICAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgIAoKY29uc3QgaW50IElORiA9IDFlOTsgIApjb25zdCBsbCBMSU5GID0gMWUxODsgIAoKY29uc3QgaW50IE4gPSAxZTUgKyA1OyAKY29uc3QgaW50IE1BWF9BID0gNzA7IApjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgICAKCmludCBwcmltZVsxOV0gPSB7MiwgMywgNSwgNywgMTEsIDEzLCAxNywgMTksIDIzLCAyOSwgMzEsIDM3LCA0MSwgNDMsIDQ3LCA1MywgNTksIDYxLCA2N307IAoKdm9pZCBhZGQoaW50JiBhLCBpbnQgYikgewoJYSArPSBiOyAKCWlmIChhID49IE1PRCkgYSAtPSBNT0Q7IAoJaWYgKGEgPCAwKSBhICs9IE1PRDsgCn0KCmludCBiaW5wb3coaW50IGEsIGludCBiKSB7CglpbnQgYW5zID0gMTsgCglmb3IgKDsgYiA+IDA7IGIgPj49IDEpIHsKCQlpZiAoYiAmIDEpIGFucyA9IDFsbCAqIGFucyAqIGEgJSBNT0Q7ICAKCQlhID0gMWxsICogYSAqIGEgJSBNT0Q7IAoJfQoJcmV0dXJuIGFuczsKfQoKaW50IG47ICAKaW50IGFbTl07CmludCBjbnRbTUFYX0EgKyA1XTsgLy8gY250W3hdID0gc+G7kSBs4bqnbiB4deG6pXQgaGnhu4duIGPhu6dhIGdpw6EgdHLhu4sgeAoKLy8gbWFzayDEkeG6oWkgZGnhu4duIGNobyB0w61uaCBjaOG6tW4gbOG6uyBj4bunYSBjw6FjIHPhu5EgbcWpIGPhu6dhIG3hu5l0IHThuq1wIGjhu6NwIHPhu5Egbmd1ecOqbiB04buRLCB0cm9uZyDEkcOzOiAKLy8gYml0IHRo4bupIGkgbMOgIDE6IHPhu5Egbmd1ecOqbiB04buRIHRo4bupIGkgeHXhuqV0IGhp4buHbiBs4bq7IGzhuqduIGhheSBjw7Mgc+G7kSBtxakgbOG6uwovLyBiaXQgdGjhu6kgaSBsw6AgMDogc+G7kSBuZ3V5w6puIHThu5EgdGjhu6kgaSB4deG6pXQgaGnhu4duIGNo4bq1biBs4bqnbiBoYXkgY8OzIHPhu5EgbcWpIGNo4bq1bgoKaW50IHByaW1lX21hc2tbTUFYX0EgKyA1XTsgLy8gcHJpbWVfbWFza1t4XSA9IG1hc2sgdMawxqFuZyDhu6luZyB24bubaSB04bqtcCDGsOG7m2Mgbmd1ecOqbiB04buRIGPhu6dhIHgKaW50IGRwW01BWF9BICsgNV1bMSA8PCAxOV07IC8vIGRwW3hdW21hc2tdID0gU+G7kSB04bqtcCBo4bujcCBraMOhYyBuaGF1IGtoaSB4w6l0IGPDoWMgZ2nDoSB0cuG7iyB04burIDEgxJHhur9uIHgsCgkJCQkJCQkvLyB24bubaSBtYXNrIHTGsMahbmcg4bupbmcgduG7m2kgdOG6rXAgxrDhu5tjIG5ndXnDqm4gdOG7kSBj4bunYSB0w61jaCBj4bunYSB04bqtcCBo4bujcAoKaW50IG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCQoJY2luID4+IG47IAoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJY2luID4+IGFbaV07CgkJY250W2FbaV1dKys7IAoJfSAKCglmb3IgKGludCB4ID0gMTsgeCA8PSBNQVhfQTsgeCsrKSB7CgkJaW50IHRtcCA9IHg7ICAKCQlmb3IgKGludCBpID0gMDsgaSA8IDE5OyBpKyspIHsKCQkJaW50IGUgPSAwOyAgIAoJCQl3aGlsZSAodG1wICUgcHJpbWVbaV0gPT0gMCkgewoJCQkJdG1wIC89IHByaW1lW2ldOyAKCQkJCWUgKz0gMTsgCgkJCX0KCQkJaWYgKGUgJiAxKSBwcmltZV9tYXNrW3hdIHw9ICgxIDw8IGkpOyAKCQl9Cgl9CgoJZHBbMF1bMF0gPSAxOyAKCWZvciAoaW50IHggPSAwOyB4IDwgTUFYX0E7IHgrKykgewoJCWZvciAoaW50IG1hc2sgPSAwOyBtYXNrIDwgKDEgPDwgMTkpOyBtYXNrKyspIHsKCQkJaWYgKGRwW3hdW21hc2tdID09IDApIGNvbnRpbnVlOyAKCQkJaWYgKGNudFt4ICsgMV0gPT0gMCkgewoJCQkJYWRkKGRwW3ggKyAxXVttYXNrXSwgZHBbeF1bbWFza10pOyAKCQkJfQoJCQllbHNlIHsKCQkJCS8vIHRow6ptIHbDoG8gdOG6rXAgaOG7o3AgaGnhu4duIHThuqFpIGNo4bq1biBwaOG6p24gdOG7rSBjw7MgZ2nDoSB0cuG7iyBsw6AgeCArIDEKCQkJCWFkZChkcFt4ICsgMV1bbWFza10sIDFsbCAqIGRwW3hdW21hc2tdICogYmlucG93KDIsIGNudFt4ICsgMV0gLSAxKSAlIE1PRCk7CgkJCQkvLyB0aMOqbSB2w6BvIHThuq1wIGjhu6NwIGhp4buHbiB04bqhaSBs4bq7IHBo4bqnbiB04butIGPDsyBnacOhIHRy4buLIGzDoCB4ICsgMQoJCQkJYWRkKGRwW3ggKyAxXVttYXNrIF4gcHJpbWVfbWFza1t4ICsgMV1dLCAxbGwgKiBkcFt4XVttYXNrXSAqIGJpbnBvdygyLCBjbnRbeCArIDFdIC0gMSkgJSBNT0QpOyAKCQkJfQoJCX0KCX0KCglpbnQgYW5zID0gZHBbTUFYX0FdWzBdOyAKCWFkZChhbnMsIC0xKTsgLy8gdHLhu6sgxJFpIHRyxrDhu51uZyBo4bujcCB04bqtcCBy4buXbmcgCgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0=