#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';

    }
}