//#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") #include <bits/stdc++.h> // #include <bits/extc++.h> using namespace std; #define debug(s) cout << #s << " = " << s << endl #define all(v) (v).begin(), (v).end() #define KeepUnique(v) (v).erase( unique(all(v)), v.end() ) #define MEMSET(v, val) memset(v, val, sizeof (v)) #define PB push_back #define endl '\n' typedef long long ll; inline int myrand(int l, int r) { int ret = rand(); ret <<= 15; ret ^= rand(); if(ret < 0) ret = -ret; ret %= (r-l+1); ret += l; return ret; } template <typename F, typename S> ostream& operator << (ostream& os, const pair< F, S>& p) { return os<<"(" <<p.first<<", "<<p.second<<")"; } typedef pair<int, int> ii; template<typename T> using min_pq = std::priority_queue<T, vector<T>, greater<T> >; //int dx[] = {-1, +0, +1, +0}; //int dy[] = {+0, +1, +0, -1}; const int maxn = 100005; const int mod = 1e9 + 7; int n; vector<int> v; vector<int> g[maxn]; int vis[maxn]; int spf[1000005]; vector<int> ppf(int x) { set<int> st; while(x != 1) { st.insert(spf[x]); x /= spf[x]; } vector<int> ret(st.begin(), st.end()); return ret; } set<int> id[1000005]; void Visited(int u) { vector<int> pf = ppf(v[u]); for(int b : pf) { id[b].erase(u); } } void dfs(int uu) { queue<int> q; vis[uu] = 1; q.emplace(uu); Visited(uu); while(q.size()) { int u = q.front(); q.pop(); vector<int> pf = ppf(v[u]); vector<int> del; for(int b : pf) { for(int v : id[b]) { if(!vis[v]) { q.emplace(v); vis[v] = 1; del.emplace_back(v); } } } for(int b : del) { Visited(b); } } } int qpow(int b, int p) { int ret = 1; while(p) { if(p & 1) ret = (1LL * ret * b) % mod; b = (1LL * b * b) % mod, p >>= 1; } return ret; } int32_t main () { // freopen("in", "r", stdin); memset(spf, 127, sizeof spf); for(int i = 2; i <= 1000000; i++) { if(spf[i] > 10000000) { for(int j = i; j <= 1000000; j += i) { spf[j] = min(spf[j], i); } } } int t; cin >> t; while(t--) { for(int i = 1; i <= 1000000; i++) { id[i].clear(); } cin >> n; v.resize(n); for(int &b : v) cin >> b; for(int i = 0; i < v.size(); i++) { vector<int> pf = ppf(v[i]); for(int x : pf) { id[x].insert(i); } } memset(vis, 0, sizeof vis); int comp = 0; for(int i = 0; i < n; i++) { if(!vis[i]) { comp++; dfs(i); } } int ans = qpow(2, comp); if(ans < 2) ans = ans + mod - 2; else ans -= 2; cout << ans << endl; } }