#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 105
#define mod 1000000007
int A[305][305];
int num_prime,prime[400],f[2005];
void getprime()
{
for (int i=2;i<=2000;i++) f[i]=true;
for (int i=2;i<=2000;i++)
if (f[i])
{
bool flag=true;
for (int j=2;j*j<=i;j++)
if (i % j==0 )
{
flag=false;
break;
}
if (flag)
{
prime[num_prime++]=i;
int k=2;
while (k*i<=2000)
{
f[k*i]=false;
k++;
}
}
}
}
inline int gauss(int r,int c)
{
int k,col,i,j,kk;
int an;
for(k=col=0;k<r&&col<c;k++,col++)
{
kk=k;
for(i=k+1;i<r;i++)
if(abs(A[i][col])>abs(A[kk][col])) kk=i;
if(kk!=k)
{
for(j=col;j<=c;j++)
swap(A[k][j],A[kk][j]);
}
if(A[k][col]==0)
{
k--;
continue ;
}
for(i=k+1;i<r;i++)
if(A[i][col]!=0)
for(j=col;j<=c;j++)
A[i][j]^=A[k][j];
}
int ans=1;
for (i=0;i<(c-k);i++)
{
ans=(ans*2)%mod;
}
return (ans-1+mod)%mod;
}
int main()
{
int T,i,j,t,up,n;
long long y;
int Case=0;
getprime();
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
t=0;
memset(A,0,sizeof(A));
for (i=0;i<n;i++)
{
scanf("%I64d",&y);
for (int j=0;j<num_prime;j++)
{
int k=0;
while (y%prime[j]==0)
{
y=y/prime[j];
k++;
}
if (k%2==0)
A[j][i]=0;
else
A[j][i]=1;
}
}
t=num_prime;
for (i=0;i<t;i++)
{
A[i][n]=0;
}
printf("Case #%d:\n",++Case);
printf("%d\n",gauss(t,n));
}
return 0;
}
hdu 5833
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.