import java.io.*; import java.lang.reflect.Array; import java.math.BigInteger; import java.util.*; import java.lang.*; import java.util.concurrent.LinkedBlockingDeque; import static java.lang.Math.*; public class Main implements Runnable { public static void main(String[] args) { new Thread(null, new Main(), "Check2", 1 << 28).start();// to increse stack size in java } long mod=(long)(1e9+7); public void run() { Scanner in=new Scanner(System.in); PrintWriter w = new PrintWriter(System.out); int t=in.nextInt(); int N=(int)(1e6+15); while (t-->0) { int n = in.nextInt(); int array[] = new int[n]; for(int i=0;i<n;i++)array[i]=in.nextInt(); list=new ArrayList[N]; int frq[]=new int[N]; int b[]=new int[N]; sev(b,b.length-1); for(int i=0;i<N;i++)list[i]=new ArrayList<>(); for(int i=0;i<n;i++){ frq[array[i]]++; } for(int i=2;i<N;i++){ if(b[i]>0) { for (int j = i; j < N; j += i) { if(frq[j]>0){ int tmp=frq[j]; while (tmp-->0){ list[i].add(j); list[j].add(i); } } } } } int size=frq[1]; int v[]=new int[N]; for(int i=2;i<N;i++){ if(b[i]>0){ nodes=0; dfs(i,frq,v); if(nodes>0){ size++; } } } long ans=power(2,size); ans=ans-2+mod; ans%=mod; w.println(ans); } w.close(); } ArrayList <Integer> list[]; int nodes=0; void dfs(int i,int frq[],int v[]){ if(v[i]==1)return; v[i]=1; if(frq[i]>0) { nodes++; } for(int itr:list[i]){ dfs(itr,frq,v); } } long power(long x,long y){ if(y==0)return 1%mod; if(y==1)return x%mod; long res=1; x=x%mod; while(y>0) { if((y%2)!=0){ res=(res*x)%mod; } y=y/2; x=(x*x)%mod; } return res; } void sev(int a[],int n){ for(int i=2;i<=n;i++)a[i]=i; for(int i=2;i<=n;i++){ if(a[i]!=0){ for(int j=2*i;j<=n;){ a[j]=0; j=j+i; } } } } }