比赛 |
2022级数学专题练习赛1 |
评测结果 |
AAAAAAAAAA |
题目名称 |
乘积是平方数 |
最终得分 |
100 |
用户昵称 |
nick |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2022-12-12 21:30:54 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=105;
int a[105][105]={0},n,m=0;
ll b[105];
bool vis[505]={0};
void zs()
{
for(int i=2;i<=500;i++) if(!vis[i])
for(int j=2;j*i<=500;j++) vis[j*i]=1;
for(int i=2;i<=500;i++) if(!vis[i]) b[++m]=i;
}
ll gauss()
{
int i=1,j=1;
while(i<=n&&j<=m)
{
int r=i;
for(;r<=n;r++) if(a[r][j])break;
if(r<=n)
{
for(int k=0;k<=m;k++) swap(a[i][k],a[r][k]);
for(int k=0;k<=n;k++) if(a[k][j]&&k!=i)
for(int c=0;c<=m;c++) a[k][c]^=a[i][c];
i++;
}
j++;
}
for(int k=i;k<n;k++) if(a[k][m])
return 0;
return (ll)1<<(n-i+1);
}
int main()
{
freopen("square1.in","r",stdin);
freopen("square1.out","w",stdout);
int T;
scanf("%d",&T);
zs();
while(T--)
{
ll x;
scanf("%d",&n);
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
cin>>x;
for(int j=1;j<=m;j++)
{
while(x%b[j]==0)
{
a[i][j]^=1;
x/=b[j];
}
}
}
cout<<gauss()-1<<endl;
}
return 0;
}