#include<bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; typedef tree< int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; #define lli long long int #define llu unsigned long long int #define all(v) v.begin(),v.end() #define pb push_back #define mp make_pair #define F first #define S second #define F0(a) memset(a,0,sizeof(a)); const long double EPS = 1e-10; const lli MOD = 1000000007ll; const lli mod1 = 1000000009ll; const lli mod2 = 1100000009ll; int INF = 2147483645; lli INFINF = 9223372036854775807; int debug = 0; int bit_count(int _x){int _ret=0;while(_x){if(_x%2==1)_ret++;_x/=2;}return _ret;} lli bit(lli _mask,lli _i){return (_mask&(1<<_i))==0?0:1;} lli powermod(lli _a,lli _b,lli _m=MOD){lli _r=1;while(_b){if(_b%2==1)_r=(_r*_a)%_m;_b/=2;_a=(_a*_a)%_m;}return _r;} lli abmod(lli a,lli m=MOD){while(a>=m) a-=m; while(a<0) a+=m; return a;} lli add(lli a,lli b,lli m=MOD){lli x=a+b;while(x>=m)x-=m;return abmod(x);} lli sub(lli a,lli b,lli m=MOD){lli x=a-b;while(x<0)x+=m;return abmod(x);} lli mul(lli a,lli b,lli m=MOD){lli x=a*b;x%=m;return abmod(x);} #define N 1000010 int arr[N]; vector<int> v[N]; #define M 100010 bool u[M], x[N]; vector<int> vv[N]; int ans; void dfs(int p, bool uu){ if(uu){ u[p] = true; for(int i:v[arr[p]]) if(!x[i]) dfs(i, !uu); } else{ x[p] = true; for(int i:vv[p]){ if(!u[i]) dfs(i, !uu); } } } int main(){ std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cout.precision(40); for(int i=2;i<N;i++){ if(v[i].empty()){ for(int j=i;j<N;j+=i) v[j].push_back(i); } } int t; cin >> t; int n; while(t--){ cin >> n; for(int i=0;i<n;i++){ cin >> arr[i]; for(int j:v[arr[i]]) vv[j].push_back(i); } for(int i=0;i<n;i++){ if(!u[i]){ dfs(i, true); ans++; } } cout << sub(powermod(2, ans), 2) << endl; ans = 0; fill(u, u+M, false); fill(x, x+N, false); for(int i=0;i<N;i++) vv[i].clear(); } return 0; }