hdu 5833

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章