hdu 5833

来源:互联网 发布:plc编程指令大全 编辑:程序博客网 时间:2024/06/02 11:36
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define maxn 105#define mod 1000000007int 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;}
0 0