给一组数 求这个数组内有几对数的乘积是平方数(某个数的平方)
素数筛筛出所需范围素数 将数组里的数中素数的平方统统筛掉
累计符合条件的对数即可
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
bool IsPrim[1111];
int pm[1111];
int p[1111111];
int tp;
void Init()
{
tp = 0;
memset(IsPrim,true,sizeof(IsPrim));
int i,j;
for(i = 2; i <= 1000; ++i)
{
if(IsPrim[i]) pm[tp++] = i;
for(j = 0; j < tp && pm[j]*i <= 1000; ++j)
{
IsPrim[pm[j]*i] = false;
if(!pm[j]%i) break;
}
}
}
int main()
{
Init();
int i;
int t,n,sum,x,w;
scanf("%d",&t);
while(t--)
{
sum = 0;
memset(p,0,sizeof(p));
scanf("%d",&n);
while(n--)
{
scanf("%d",&x);
for(i = 0; i < tp && (w = pm[i]*pm[i]) <= x; ++i)
{
while(!(x%w))
{
x /= w;
}
}
sum += p[x];
p[x]++;
}
printf("%d\n",sum);
}
return 0;
}