//#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") //#pragma GCC optimize("unroll-loops") #include <iostream> #include <stdlib.h> #include <cmath> #include <algorithm> #include <vector> #include <set> #include <map> #define uint unsigned int #define ll long long #define ull unsigned long long #define ld long double #define rep(i, l, r) for (int i = l; i < r; i++) #define repb(i, r, l) for (int i = r; i > l; i--) #define sz(a) (int)a.size() #define fi first #define se second #define mp(a, b) make_pair(a, b) using namespace std; inline void setmin(int &x, int y) { if (y < x) x = y; } inline void setmax(int &x, int y) { if (y > x) x = y; } inline void setmin(ll &x, ll y) { if (y < x) x = y; } inline void setmax(ll &x, ll y) { if (y > x) x = y; } const int N = 1000000 + 1; const int inf = (int)1e9 + 1; const ll big = (ll)1e18 + 1; const int P = 239; const int MOD = (int)1e9 + 7; const int MOD1 = (int)1e9 + 9; const double eps = 1e-9; const double pi = atan2(0, -1); const int ABC = 26; vector<int> g[N]; bool used[N]; int cnt[N]; void dfs(int u) { used[u] = true; for (int v : g[u]) if (!used[v]) dfs(v); } int main() { //freopen("a.in", "r", stdin); //freopen("a.out", "w", stdout); ios_base::sync_with_stdio(0); cin.tie(0); cout.precision(20); cout << fixed; //ll TL = 0.95 * CLOCKS_PER_SEC; //clock_t time = clock(); int T; cin >> T; while (T--) { int n; cin >> n; fill(cnt, cnt + N, 0); fill(used, used + N, false); rep(i, 0, N) g[i].clear(); rep(i, 0, n) { int x; cin >> x; cnt[x]++; } rep(x, 2, N) { int mi = -1; for (int y = x; y < N; y += x) if (cnt[y]) { if (mi == -1) mi = y; else { g[mi].push_back(y); g[y].push_back(mi); } } } int c = 0; rep(i, 2, N) if (cnt[i] && !used[i]) { dfs(i); c++; } c += cnt[1]; int res = 1; rep(i, 0, c) res = res * 2 % MOD; res -= 2; if (res < 0) res += MOD; cout << res << "\n"; } return 0; }