http://blog.youkuaiyun.com/chy20142109/article/details/52206558
#include<bits/stdc++.h>
#define maxn 350
using namespace std;
typedef long long ll;
const ll mod=1000000007;
int n;
int p[2000];
int cnt;
int jz[maxn][maxn];
void init()
{
for(int i=2;i<=2000;i++)
{
bool zhi=true;
for(int j=2;j*j<=i;j++)
if(i%j==0)
{
zhi=false;
break;
}
if(zhi) p[i]=++cnt;
}
}
ll mypow(ll x,ll n)
{
ll ret=1;
while(n)
{
if(n&1) ret=(ret*x)%mod;
x=(x*x)%mod;
n>>=1;
}
return ret;
}
int solve()
{
int i,j;
i=j=1;
while(i<=cnt&&j<=n)
{
int r=i;
while(r<=cnt&&!jz[r][j]) r++;
if(r<=cnt)
{
if(r!=i) for(int k=j;k<=n;k++) swap(jz[r][k],jz[i][k]);
for(int k=i+1;k<=cnt;k++)
if(jz[k][j])
for(int u=j;u<=n;u++)
jz[k][u]^=jz[i][u];
i++;
}
j++;
}
return i;
}
int main()
{
init();
int T;
scanf("%d",&T);
for(int i=1;i<=T;i++)
{
scanf("%d",&n);
ll A;
memset(jz,0,sizeof(jz));
for(int j=1;j<=n;j++)
{
scanf("%I64d",&A);
for(int k=2;k*k<=4000000&&k*k<=A;k++)
{
while(A%k==0)
{
jz[p[k]][j]^=1;
A/=k;
}
}
if(A!=1) jz[p[A]][j]^=1;
}
printf("Case #%d:\n%I64d\n",i,mypow(2,n-solve()+1)-1);
}
return 0;
}