#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define ppp pop_back #define fi first #define se second #define pii pair<int,int> const int N = 1e6 + 5; const int p = 1e9 + 7; vector<int> a; int parent[N], depth[N]; vector<int> divs[N]; set<int> b, c; void find_divs() { for (int m=2; m<N; m++) { int t = -1; for (int k=2; k*k<=m; k++) { if (m%k==0) { t = k; break; } } if (t == -1) divs[m].pb(m); else { int n = m/t; divs[m] = divs[n]; int l = lower_bound(divs[m].begin(), divs[m].end(), t) - divs[m].begin(); if (l == divs[m].size()) divs[m].pb(t); else if (divs[m][l] != t) divs[m].pb(t); } } } int find(int v) { if (v == parent[v]) return v; return parent[v] = find(parent[v]); } void merge(int u, int v) { u = find(u); v = find(v); if (depth[u] < depth[v]) swap(u,v); parent[v] = u; if (depth[u] == depth[v]) depth[u]++; } void merge_vec(vector<int> v) { if (v.size() == 1) return; for (int i=0; i<v.size()-1; i++) merge(v[i], v[i+1]); } ll mpow(int x, int n) { if (n==0) return 1; ll res = mpow(x, n/2); res = (res*res)%p; if (n&1) res = (res*x)%p; return res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL freopen("input.txt", "r", stdin); #endif find_divs(); int t; cin >> t; for (int q=1; q<=t; q++) { for (int i=0; i<N; i++) { parent[i] = i; depth[i] = 0; } a.clear(); b.clear(); c.clear(); int n; cin >> n; int ones = 0; for (int i=1; i<=n; i++) { int cur; cin >> cur; if (cur == 1) ones++; else a.pb(cur); } for (int i=0; i<a.size(); i++) { merge_vec(divs[a[i]]); for (int j=0; j<divs[a[i]].size(); j++) b.insert(divs[a[i]][j]); } for (auto it=b.begin(); it!=b.end(); it++) c.insert(find(*it)); int k = c.size(); ll res = mpow(2, k+ones); cout << res-2 << "\n"; } }