#include <bits/stdc++.h>
/**------------------------------------------
---------Author: PhcKhnhTapCode -------------
---------From: CHV with luv <3 --------------
---------Training To Win Voi 25 !!! ---------
---------------------------------------------
------------------MemoryLimitExeeded<ooo>-**/
using namespace std;
#ifdef phckhnh_local
#include "D:\Users\AdminTCT\Desktop\CP\debug.h"
#else
#define debug(...) 0
#endif
#define ll long long
#define db long double
#define fi first
#define se second
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<ii>
#define vvi vector<vi>
#define vvvi vector<vvi>
#define pub push_back
#define all(v) v.begin(),v.end()
#define mid(l, r) ((l + r) >> 1LL)
#define left(id) (id << 1LL)
#define right(id) ((id << 1LL) | 1LL)
#define Mask(i) (1LL << (i))
#define Onbit(n, i) (n | Mask(i))
#define Ofbit(n, i) (n ^ Mask(i))
#define Bit(n, i) ((n >> (i)) & 1LL)
#define Log2(n) (63 - __builtin_clzll(n))
#define powbit(n) __builtin_popcountll(n)
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define FOD(i, b, a) for (int i = b; i >= a; --i)
#define rep(i, n) for (int i = 0; i < n; ++i)
#define repd(i, n) for (int i = n - 1; ~i;--i)
#define repv(v, H) for (auto &v: H)
template <class T> bool maximize(T &A, const T &B) {if(A < B) {return A = B, true;} return false;}
template <class T> bool minimize(T &A, const T &B) {if(A > B) {return A = B, true;} return false;}
namespace std {
template <int D, typename T> struct Vec : public vector<Vec<D - 1, T>> {
static_assert(D >= 1, "Dimension must be positive");
template <typename... Args>
Vec(int n = 0, Args... args) : vector<Vec<D - 1, T>>(n, Vec<D - 1, T>(args...)) {}
};
template <typename T> struct Vec<1, T> : public vector<T> {
Vec(int n = 0, T val = T()) : std::vector<T>(n, val) {}
};
}
const int dx[4] = {0, +1, 0, -1};
const int dy[4] = {+1, 0, -1, 0};
const int inf = 1e9, BLOCK = 700, MAXN = 5e5 + 10;
const long long oo = 1e18, BASE = 311, MOD = 1e9 + 7;
//____________________________________________________________________
int n, a[75];
const vector <int> primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67};
int mask[75];
int dp[75][(1LL << 19) + 2];
ll heso[75][2];
struct Combination{
vector <long long> fact, inv;
ll POW(long long a, long long n) {
a %= MOD;
long long res = 1;
while(n) {
if(n & 1) res = (res * a) % MOD;
a = (a * a) % MOD;
n >>= 1;
}
return res;
}
void build(int N) {
fact.assign(N + 3, 1);
inv.assign(N + 3, 1);
for (int i = 1; i <= N; ++i)
fact[i] = (1LL * fact[i - 1] * i) % MOD;
inv[N] = POW(fact[N], MOD - 2);
for (int i = N - 1; i >= 0; --i)
inv[i] = (1LL * inv[i + 1] * (i + 1)) % MOD;
}
ll get(int k, int n) {
if(k < 0 || n < k) return 0;
return (fact[n] * inv[n - k]) % MOD * inv[k] % MOD;
}
// (k, n) = 0 if k > n
// (k, n) = n * inv_fact[k] * (k - 1, n - 1)
// sigma (i, n) = 2 ^ n :i = 0 -> n
// sigma (k, i) = (k + 1, n + 1) :i = 0 -> n
// sigma (i, n + i) = (m, n + m + 1) :i = 0 -> m
// sigma {(i, n) ^ 2} = (n, 2n) :i = 0 -> n
// sigma {k * (k, n)} = n * 2 ^ (n - 1) :i = 1 -> n
// x[1] + x[2] + .. + x[n] = m (x[i] >= 0) => (n - 1, m + n - 1)
// x[1] + x[2] + .. + x[n] <= m (x[i] >= 0) => (n, m + n)
// cell(u, v) -> cell(x, y) => (x - u, x + y - u - v)
}C;
ll solve(int i, int nmask) {
if(i > 70) {
if(nmask == 0) return 1LL;
return 0;
}
if(~dp[i][nmask]) return dp[i][nmask];
ll cur = 0;
// if()
cur += (solve(i + 1, nmask) * heso[i][0]) % MOD;
cur %= MOD;
cur += (solve(i + 1, nmask ^ mask[i]) * heso[i][1]) % MOD;
cur %= MOD;
return dp[i][nmask] = cur;
}
void phckhnh() {
for (int i = 2; i <= 70; ++i) {
int N = i;
for (int p = 0; p < 19; ++p) {
int pow = 0;
while(N % primes[p] == 0) N /= primes[p], ++pow;
if(pow % 2 == 1) mask[i] = mask[i] | (1 << p);
}
}
cin >> n;
for (int i = 1; i <= n; ++i) {
int val; cin >> val;
a[val]++;
}
C.build(n);
for (int i = 1; i <= 70; ++i) {
heso[i][0] = 1, heso[i][1] = 0;
for (int cnt = 1; cnt <= a[i]; ++cnt) {
heso[i][cnt & 1] += C.get(cnt, a[i]);
heso[i][cnt & 1] %= MOD;
}
// if(heso[i][0] = 0) heso[i][0] = 1;
// debug(heso[i]);
}
memset(dp, -1, sizeof dp);
cout << (solve(1, 0) + MOD - 1) % MOD;
}
//____________________________________________________________________
main(){
//____________________________________________________
ios_base :: sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
#define ooo "a"
if (fopen(ooo".inp", "r")) {
freopen(ooo".inp", "r", stdin);
freopen(ooo".out", "w", stdout);
}
//____________________________________________________
int Ntest = 1;
// cin >> Ntest;
while(Ntest--) {
phckhnh();
cout << endl;
}
cerr <<"\nPhcKhnh's TimeRun: " << (1.0 * clock() / CLOCKS_PER_SEC) << "s. \n";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0tLS0tLS0tQXV0aG9yOiBQaGNLaG5oVGFwQ29kZSAtLS0tLS0tLS0tLS0tCi0tLS0tLS0tLUZyb206IENIViB3aXRoIGx1diA8MyAtLS0tLS0tLS0tLS0tLQotLS0tLS0tLS1UcmFpbmluZyBUbyBXaW4gVm9pIDI1ICEhISAtLS0tLS0tLS0gCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLS0tLS0tLS0tLS0tLS0tLS1NZW1vcnlMaW1pdEV4ZWVkZWQ8b29vPi0qKi8KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojaWZkZWYgcGhja2huaF9sb2NhbAogICAjaW5jbHVkZSAiRDpcVXNlcnNcQWRtaW5UQ1RcRGVza3RvcFxDUFxkZWJ1Zy5oIgojZWxzZQogICAjZGVmaW5lIGRlYnVnKC4uLikgMAojZW5kaWYKCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgZGIgbG9uZyBkb3VibGUKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KCiNkZWZpbmUgdmkgdmVjdG9yPGludD4KI2RlZmluZSB2aWkgdmVjdG9yPGlpPgojZGVmaW5lIHZ2aSB2ZWN0b3I8dmk+CiNkZWZpbmUgdnZ2aSB2ZWN0b3I8dnZpPgojZGVmaW5lIHB1YiBwdXNoX2JhY2sKI2RlZmluZSBhbGwodikgdi5iZWdpbigpLHYuZW5kKCkKCiNkZWZpbmUgbWlkKGwsIHIpICgobCArIHIpID4+IDFMTCkKI2RlZmluZSBsZWZ0KGlkKSAgKGlkIDw8IDFMTCkKI2RlZmluZSByaWdodChpZCkgKChpZCA8PCAxTEwpIHwgMUxMKQoKI2RlZmluZSBNYXNrKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIE9uYml0KG4sIGkpIChuIHwgTWFzayhpKSkKI2RlZmluZSBPZmJpdChuLCBpKSAobiBeIE1hc2soaSkpCiNkZWZpbmUgQml0KG4sIGkpICgobiA+PiAoaSkpICYgMUxMKQojZGVmaW5lIExvZzIobikgKDYzIC0gX19idWlsdGluX2NsemxsKG4pKQojZGVmaW5lIHBvd2JpdChuKSBfX2J1aWx0aW5fcG9wY291bnRsbChuKQoKI2RlZmluZSBGT1IoaSwgYSwgYikgIGZvciAoaW50IGkgPSBhOyBpIDw9IGI7ICsraSkgCiNkZWZpbmUgRk9EKGksIGIsIGEpIGZvciAoaW50IGkgPSBiOyBpID49IGE7IC0taSkKI2RlZmluZSByZXAoaSwgbikgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQojZGVmaW5lIHJlcGQoaSwgbikgZm9yIChpbnQgaSA9IG4gLSAxOyB+aTstLWkpCiNkZWZpbmUgcmVwdih2LCBIKSBmb3IgKGF1dG8gJnY6IEgpCgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBtYXhpbWl6ZShUICZBLCBjb25zdCBUICZCKSB7aWYoQSA8IEIpIHtyZXR1cm4gQSA9IEIsIHRydWU7fSByZXR1cm4gZmFsc2U7fQp0ZW1wbGF0ZSA8Y2xhc3MgVD4gYm9vbCBtaW5pbWl6ZShUICZBLCBjb25zdCBUICZCKSB7aWYoQSA+IEIpIHtyZXR1cm4gQSA9IEIsIHRydWU7fSByZXR1cm4gZmFsc2U7fQoKbmFtZXNwYWNlIHN0ZCB7CiAgICB0ZW1wbGF0ZSA8aW50IEQsIHR5cGVuYW1lIFQ+IHN0cnVjdCBWZWMgOiBwdWJsaWMgdmVjdG9yPFZlYzxEIC0gMSwgVD4+IHsKICAgICAgICBzdGF0aWNfYXNzZXJ0KEQgPj0gMSwgIkRpbWVuc2lvbiBtdXN0IGJlIHBvc2l0aXZlIik7CiAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CiAgICAgICAgVmVjKGludCBuID0gMCwgQXJncy4uLiBhcmdzKSA6IHZlY3RvcjxWZWM8RCAtIDEsIFQ+PihuLCBWZWM8RCAtIDEsIFQ+KGFyZ3MuLi4pKSB7fQogICAgfTsKICAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVmVjPDEsIFQ+IDogcHVibGljIHZlY3RvcjxUPiB7CiAgICAgICAgVmVjKGludCBuID0gMCwgVCB2YWwgPSBUKCkpIDogc3RkOjp2ZWN0b3I8VD4obiwgdmFsKSB7fQogICAgfTsKfQoKY29uc3QgaW50IGR4WzRdID0gezAsICsxLCAwLCAtMX07CmNvbnN0IGludCBkeVs0XSA9IHsrMSwgMCwgLTEsIDB9Owpjb25zdCBpbnQgaW5mID0gMWU5LCBCTE9DSyA9IDcwMCwgTUFYTiA9IDVlNSArIDEwOwpjb25zdCBsb25nIGxvbmcgb28gPSAxZTE4LCBCQVNFID0gMzExLCBNT0QgPSAxZTkgKyA3OwovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIAoKaW50IG4sIGFbNzVdOwpjb25zdCB2ZWN0b3IgPGludD4gcHJpbWVzID0gezIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsIDQzLCA0NywgNTMsIDU5LCA2MSwgNjd9OwppbnQgbWFza1s3NV07CmludCBkcFs3NV1bKDFMTCA8PCAxOSkgKyAyXTsKbGwgaGVzb1s3NV1bMl07CgpzdHJ1Y3QgQ29tYmluYXRpb257CiAgICB2ZWN0b3IgPGxvbmcgbG9uZz4gZmFjdCwgaW52OwoKICAgIGxsIFBPVyhsb25nIGxvbmcgYSwgbG9uZyBsb25nIG4pIHsKICAgICAgICBhICU9IE1PRDsKICAgICAgICBsb25nIGxvbmcgcmVzID0gMTsKICAgICAgICB3aGlsZShuKSB7CiAgICAgICAgICAgIGlmKG4gJiAxKSByZXMgPSAocmVzICogYSkgJSBNT0Q7CiAgICAgICAgICAgIGEgPSAoYSAqIGEpICUgTU9EOwogICAgICAgICAgICBuID4+PSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQoKICAgIHZvaWQgYnVpbGQoaW50IE4pIHsKICAgICAgICBmYWN0LmFzc2lnbihOICsgMywgMSk7CiAgICAgICAgaW52LmFzc2lnbihOICsgMywgMSk7CiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgKytpKQogICAgICAgICAgICBmYWN0W2ldID0gKDFMTCAqIGZhY3RbaSAtIDFdICogaSkgJSBNT0Q7CiAgICAgICAgaW52W05dID0gUE9XKGZhY3RbTl0sIE1PRCAtIDIpOwogICAgICAgIGZvciAoaW50IGkgPSBOIC0gMTsgaSA+PSAwOyAtLWkpCiAgICAgICAgICAgIGludltpXSA9ICgxTEwgKiBpbnZbaSArIDFdICogKGkgKyAxKSkgJSBNT0Q7CiAgICB9CgogICAgbGwgZ2V0KGludCBrLCBpbnQgbikgewogICAgICAgIGlmKGsgPCAwIHx8IG4gPCBrKSByZXR1cm4gMDsKICAgICAgICByZXR1cm4gKGZhY3Rbbl0gKiBpbnZbbiAtIGtdKSAlIE1PRCAqIGludltrXSAlIE1PRDsKICAgIH0KICAgIC8vICAgICAgICAgICAgIChrLCBuKSA9IDAgaWYgayA+IG4KICAgIC8vICAgICAgICAgICAgIChrLCBuKSA9IG4gKiBpbnZfZmFjdFtrXSAqIChrIC0gMSwgbiAtIDEpCiAgICAvLyAgICAgICBzaWdtYSAoaSwgbikgPSAyIF4gbiAgICAgICAgICAgICAgOmkgPSAwIC0+IG4KICAgIC8vICAgICAgIHNpZ21hIChrLCBpKSA9IChrICsgMSwgbiArIDEpICAgICA6aSA9IDAgLT4gbgogICAgLy8gIHNpZ21hIChpLCBuICsgaSkgID0gKG0sIG4gKyBtICsgMSkgICAgIDppID0gMCAtPiBtCiAgICAvLyBzaWdtYSB7KGksIG4pIF4gMn0gPSAobiwgMm4pICAgICAgICAgICAgOmkgPSAwIC0+IG4KICAgIC8vIHNpZ21hIHtrICogKGssIG4pfSA9IG4gKiAyIF4gKG4gLSAxKSAgICA6aSA9IDEgLT4gbgogICAgLy8geFsxXSArIHhbMl0gKyAuLiArIHhbbl0gID0gbSAoeFtpXSA+PSAwKSA9PiAobiAtIDEsIG0gKyBuIC0gMSkKICAgIC8vIHhbMV0gKyB4WzJdICsgLi4gKyB4W25dIDw9IG0gKHhbaV0gPj0gMCkgPT4gKG4sIG0gKyBuKQogICAgLy8gY2VsbCh1LCB2KSAtPiBjZWxsKHgsIHkpID0+ICh4IC0gdSwgeCArIHkgLSB1IC0gdikKfUM7CgoKCmxsIHNvbHZlKGludCBpLCBpbnQgbm1hc2spIHsKICAgIGlmKGkgPiA3MCkgewogICAgICAgIGlmKG5tYXNrID09IDApIHJldHVybiAxTEw7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZih+ZHBbaV1bbm1hc2tdKSByZXR1cm4gZHBbaV1bbm1hc2tdOwogICAgbGwgY3VyID0gMDsKICAgIC8vIGlmKCkKICAgIGN1ciArPSAoc29sdmUoaSArIDEsIG5tYXNrKSAqIGhlc29baV1bMF0pICUgTU9EOwogICAgY3VyICU9IE1PRDsKICAgIGN1ciArPSAoc29sdmUoaSArIDEsIG5tYXNrIF4gbWFza1tpXSkgKiBoZXNvW2ldWzFdKSAlIE1PRDsKICAgIGN1ciAlPSBNT0Q7CiAgICByZXR1cm4gZHBbaV1bbm1hc2tdID0gY3VyOwp9Cgp2b2lkIHBoY2tobmgoKSB7ICAgIAogIAogICAgZm9yIChpbnQgaSA9IDI7IGkgPD0gNzA7ICsraSkgewogICAgICAgIGludCBOID0gaTsKICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IDE5OyArK3ApIHsgIAogICAgICAgICAgICBpbnQgcG93ID0gMDsKICAgICAgICAgICAgd2hpbGUoTiAlIHByaW1lc1twXSA9PSAwKSBOIC89IHByaW1lc1twXSwgKytwb3c7IAogICAgICAgICAgICBpZihwb3cgJSAyID09IDEpIG1hc2tbaV0gPSBtYXNrW2ldIHwgKDEgPDwgcCk7CiAgICAgICAgfQogICAgfQogICAgY2luID4+IG47CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyArK2kpIHsKICAgICAgICBpbnQgdmFsOyBjaW4gPj4gdmFsOwogICAgICAgIGFbdmFsXSsrOwogICAgfQogICAgQy5idWlsZChuKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDcwOyArK2kpIHsKICAgICAgICBoZXNvW2ldWzBdID0gMSwgaGVzb1tpXVsxXSA9IDA7CiAgICAgICAgZm9yIChpbnQgY250ID0gMTsgY250IDw9IGFbaV07ICsrY250KSB7CiAgICAgICAgICAgIGhlc29baV1bY250ICYgMV0gKz0gQy5nZXQoY250LCBhW2ldKTsKICAgICAgICAgICAgaGVzb1tpXVtjbnQgJiAxXSAlPSBNT0Q7CiAgICAgICAgfQogICAgICAgIC8vIGlmKGhlc29baV1bMF0gPSAwKSBoZXNvW2ldWzBdID0gMTsKICAgICAgICAvLyBkZWJ1ZyhoZXNvW2ldKTsKICAgIH0KCiAgICBtZW1zZXQoZHAsIC0xLCBzaXplb2YgZHApOwogICAgY291dCA8PCAoc29sdmUoMSwgMCkgKyBNT0QgLSAxKSAlIE1PRDsKfQovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgoKCm1haW4oKXsgICAKICAgIC8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgCiAgICBpb3NfYmFzZSA6OiBzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKICAgIGNpbi50aWUobnVsbHB0cik7IGNvdXQudGllKG51bGxwdHIpOwogICAgI2RlZmluZSBvb28gImEiCiAgICBpZiAoZm9wZW4ob29vIi5pbnAiLCAiciIpKSB7CiAgICAgICAgZnJlb3Blbihvb28iLmlucCIsICJyIiwgc3RkaW4pOyAKICAgICAgICBmcmVvcGVuKG9vbyIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQogICAgLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICAKICAgIGludCBOdGVzdCA9IDE7IAogICAgLy8gY2luID4+IE50ZXN0OwogICAgd2hpbGUoTnRlc3QtLSkgewogICAgICAgIHBoY2tobmgoKTsgCiAgICAgICAgY291dCA8PCBlbmRsOwogICAgfQogICAgY2VyciA8PCJcblBoY0tobmgncyBUaW1lUnVuOiAiIDw8ICgxLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMpIDw8ICJzLiBcbiI7Cn0gICAgICAgICAgICAgICAgICAg