题意是给你n个数,让你求两个数相乘是平方数的对数。
直接先打一个素数表,然后把输入的每个数都从中取掉含有的平方数。得到一个新的数,在这些数中相互比较,如果两个数相等,那么代表这两个数的乘积为平方数。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define LL long long int
const int inf = 0x3f3f3f3f;
int a[100100];
int prime[1000100];
int pri[1000100];
int s[1000100];
map<int, int>mp;
map<int, int>::iterator it;
void init()
{
memset(prime, 0, sizeof(prime));
for (int i = 2; i < 1000100; i++)
{
if (!prime[i])
for (int j = 2 * i; j < 1000100; j += i)
prime[j] = 1;
}
int cmp = 0;
for (int i = 2; i < 1000100; i++)
if (!prime[i])
pri[cmp++] = i;
}
int main()
{
int T;
int n;
cin >> T;
init();
while (T--)
{
scanf("%d", &n);
//mp.clear();
memset(s, 0, sizeof(s));
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
int cmp = 0;
while (a[i] >= pri[cmp] * pri[cmp])
{
if (a[i] % (pri[cmp] * pri[cmp]) == 0)
a[i] /= pri[cmp] * pri[cmp];
else
cmp++;
}
s[a[i]]++;
}
int res = 0;
for (int i = 0; i < 1000100;i++)
if (s[i] >= 2)
res += (s[i] - 1)*s[i] / 2;
printf("%d\n", res);
}
return 0;
}