#include <bits/stdc++.h> #define N 1000005 #define M 100005 #define PB push_back #define mod 1000000007 using namespace std; int n, a[M], dd[M+M], p[N+M], sz; vector<int> g[M+M]; vector<int> prime; void DFS(int u, int col) { dd[u] = col; for (auto v : g[u]) { if (dd[v]) continue; DFS(v, col); } } int solve() { int tt = 0; for (int i = 1; i <= n; i++) if (!dd[i+sz]) DFS(i+sz, ++tt); int res = 1; for (int i = 1; i<=tt; i++) res = (res*2) % mod; return (res + mod-2) % mod; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("INP.TXT", "r", stdin); int T; cin >> T; p[0] = p[1] = 1; for (int i = 2; i < N; i++) if (!p[i]) { prime.PB(i); for (int j = i*2; j < N; j+=i) p[j] = 1; } sz = prime.size(); while (T--) { cin >> n; for (int i = 1; i < sz+M; i++) g[i].clear(), dd[i] = 0; for (int i = 1; i <= n; i++) { cin >> a[i]; int x = a[i]; for (int j = 0; prime[j]*prime[j] <= x; j++) if (x % prime[j] == 0) { g[j+1].PB(i+sz); g[i+sz].PB(j+1); while (x % prime[j] == 0) x /= prime[j]; } if (x > 1) { int pos = lower_bound(prime.begin(), prime.end(), x) - prime.begin() + 1; g[pos].PB(i+sz); g[i+sz].PB(pos); } } cout <<solve()<<'\n'; } }