1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include <bits/stdc++.h>
using namespace std;
#define fi first #define se second typedef pair<int, int> pii; typedef long long ll; typedef long double ld;
const int mod = 1e9 + 7; const int N = 1000 + 5, M = 12; int pri[12] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31}; int n, a[N], ind[35]; int f[N][(1 << M) + 5][2], pd[(1 << M) + 5], g[(1 << M) + 5], nxt[(1 << M) + 5];
struct solve { int P; vector<int> a, b; void main() { int n = a.size(); f[0][0][0] = 1; int mask = (1 << 11) - 1; for (int i = 0; i < n; i++) { int y = a[i], x = b[i]; memcpy(f[i + 1], f[i], sizeof f[i + 1]); for (int j = 0; j <= mask; j++) { for (int k = 0; k <= 1; k++) if (f[i][j][k]) { f[i + 1][j ^ y][k ^ 1] = (f[i + 1][j ^ y][k ^ 1] + f[i][j][k] * 1ll * pd[j & y] % mod * (k == 1 ? P : 1) % mod * x % mod) % mod; } } } memcpy(nxt, g, sizeof nxt); nxt[0] = (nxt[0] + mod - 1) % mod; for (int j = 0; j <= mask; j++) { for (int i = 0; i <= mask; i++) { nxt[i ^ j] = (nxt[i ^ j] + g[i] * 1ll * f[n][j][0] % mod * pd[i & j] % mod) % mod; } } memcpy(g, nxt, sizeof g); if (P == 1) { memcpy(nxt, g, sizeof nxt); for (int j = 0; j <= mask; j++) { for (int i = 0; i <= mask; i++) { nxt[i ^ j] = (nxt[i ^ j] + g[i] * 1ll * f[n][j][1] % mod * pd[i & j] % mod) % mod; } } memcpy(g, nxt, sizeof g); } for (int i = 0; i <= n; i++) memset(f[i], 0, sizeof f[i]); } }; solve so[N];
void MAIN() { g[0] = 1; cin >> n; for (int i = 0; i < M; i++) ind[pri[i]] = i; int mul = 1, mask = (1 << 11) - 1; for (int i = 0; i <= mask; i++) { pd[i] = 1; for (int j = 0; j < 11; j++) if ((i >> j) & 1) { pd[i] = pd[i] * 1ll * pri[j] % mod; } } for (int i = 1; i <= n; i++) { cin >> a[i]; if (a[i] == 1) {mul = mul * 2 % mod; continue;} int b = 0, w = 1; for (int j = 2; j * j <= a[i]; j++) { if (a[i] % j != 0) continue; int cnt = 0; while (a[i] % j == 0) { b ^= (1 << (ind[j])); a[i] /= j; cnt ^= 1; if (!cnt) w *= j; } } if (a[i] != 1 && a[i] < 32) { b ^= (1 << (ind[a[i]])); a[i] = 1; } so[a[i]].a.push_back(b); so[a[i]].b.push_back(w); } for (int i = 1; i <= 1000; i++) if (!so[i].a.empty()) { so[i].P = i; so[i].main(); } int res = (g[0] + mod - 1) % mod; res = (res * 1ll * mul % mod + mul - 1) % mod; res = (mod + res) % mod; cout << res << '\n'; }
int main() { ios::sync_with_stdio(0); cin.tie(0); int T = 1; while (T--) MAIN(); return 0; }
|