在第一秒操作后:
如果同一类的数量是奇数,那么经过操作后,y依旧不变,它的y幂增加,但仍为奇数幂,所以数量不变。
如果是偶数,那么y都变成偶数幂,那么此时y就变成了1。最后在统计时经过1秒后所有偶数数量的类都要加一起,如果y=1的类是奇数项,那么就还要加上这个奇数项。
最后两项取最大值就好。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<queue>
#include<map>
using namespace std;
#define LL long long
#define eps (1e-8)
const int maxn = 3e5 + 10;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int a[maxn];
map<int, int>mp;
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n;
mp.clear();
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
for (int i = 1; i <= n; i++)
{
for (int j = 2; j * j <= a[i]; j++)
{
while (a[i] % (j * j) == 0)a[i] /= (j * j);
}
mp[a[i]]++;
}
int ans0 = 0, ans1 = 0, tmp = 0;
for (auto e : mp)
{
ans0 = max(ans0, e.second);
if (e.second % 2)
{
tmp = max(tmp, e.second);
}
else
{
ans1 += e.second;
}
}
if (mp[1] % 2)ans1 += mp[1];
ans1 = max(ans1, tmp);
int m;
LL q;
scanf("%d", &m);
while (m--)
{
scanf("%lld", &q);
if (q)printf("%d\n", ans1);
else printf("%d\n", ans0);
}
}
return 0;
}