显然我们需要将数唯一分解 显然只有质因子质数为偶数才可能是完全平方数 于是可以由此得出xor方程组 高斯消元求出方程的秩 (1 << 自由因子 )-1即为答案(去掉0)
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
#define MAXN 500
#define MAXM 400
int Prime[MAXN+10], P, used;
bool isprime(int x)
{
int t = sqrt(x) + 0.5;
if(x == 1) return false;
for(int i = 2; i <= t; i++) if(x % t == 0) return false;
return true;
}
void get_prime()
{
for(int i = 1; i <= MAXN; i++)
if(isprime(i))
Prime[P++] = i;
}
template <int maxn, int maxm>
struct I_Maxtrix{
int N, M, rank;
I_Maxtrix() {}
I_Maxtrix(int x, int y) { N = x; M = y; }
int A[maxn+10][maxm+10];
void init() { memset(A, 0, sizeof(A)); }
void read()
{
for(int i = 0; i < N; i++)
for(int j = 0; j <= M; j++)
scanf("%lf", &A[i][j]);
}
void Guss()
{
int i = 0, j = 0;
//swap(N, M);
while(i < N && j < M)
{
int r = i;
for(int k = i; k < N; k++) if(A[k][j]) { r = k; break; }
if(A[r][j])
{
if(r != i) for(int k = 0; k <= M; k++) swap(A[r][k], A[i][k]);
for(int u = i+1; u < N; u++)
if(A[u][j])
for(int k = i; k <= M; k++)
A[u][k] ^= A[i][k];
i++;
}
j++;
}
rank = i;
}
};
I_Maxtrix <MAXN, MAXM> A;
void Div(long long x, int pos)
{
for(int i = 0; i < P; i++)
while(x % Prime[i] == 0) {
A.A[i][pos] ^= 1;
x /= Prime[i];
used = max(used, i);
}
}
int main()
{
get_prime();
int n, m, kase;
scanf("%d", &kase);
while(kase--)
{
scanf("%d", &n);
A.M = n;
A.init();
for(int i = 0; i < n; i++)
{
long long x;
scanf("%lld", &x);
Div(x, i);
}
A.N = used+1;
A.Guss();
int ans = n-(A.rank);
printf("%lld\n", (1LL << (ans))-1);
}
}