//#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;
}