Given n integers you can generate 2 n
用n个未知数
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define LL long long
const int maxp=500;
int prm[510],tot,n,m,a[110][110];
bool have[510];
void init()
{
int i,j;
for (i=2;i<=maxp;i++)
{
if (!have[i]) prm[tot++]=i;
for (j=0;j<tot&&prm[j]*i<=maxp;j++)
{
have[prm[j]*i]=1;
if (i%prm[j]==0) break;
}
}
}
void build()
{
int i,j;
LL x;
m=0;
scanf("%d",&n);
memset(a,0,sizeof(a));
for (i=0;i<n;i++)
{
scanf("%lld",&x);
for (j=0;j<tot&&x>1;j++)
if (x%prm[j]==0)
{
m=max(m,j+1);
while (x%prm[j]==0)
{
x/=prm[j];
a[j][i]^=1;
}
}
}
}
void solve()
{
int i=0,j,k,r,x;
for (j=0;j<n&&i<m;j++)
{
r=i;
for (k=i;k<m;k++)
if (a[k][j])
{
r=k;
break;
}
if (r!=i) for (k=0;k<=n;k++) swap(a[r][k],a[i][k]);
if (a[i][j])
{
for (k=i+1;k<m;k++)
if (a[k][j])
for (x=i;x<=n;x++)
a[k][x]^=a[i][x];
i++;
}
}
printf("%lld\n",(1LL<<n-i)-1);
}
int main()
{
int T;
init();
scanf("%d",&T);
while (T--)
{
build();
solve();
}
}