题意:
询问给定的数字 有多少对两两相乘是一个平方数。
思路:
n=x*x*y
m=z*z*y
n*m =x*x *z*z *y *y
因此只要是一次方相乘的数字相同就是一对。 例如 32= 2*2 * 2*2 * 2 8= 2*2 *2 相乘就是一组满足条件的解。
之后从抽象出来的数组中求组合Ca[i] 2
#include <iostream>
#include <cstdio>
#include <queue>
#include <map>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cstring>
using namespace std;
int s[1000005];
int a[1000005];
int prime[10005];
int main()
{
int cnt=0;
for(int i=2;i<=1000;i++)
{
for(int j=2;j*j<=i;j++)
{
if( i%j==0 )
{
s[i]=1;
break;
}
}
if(!s[i])
prime[++cnt]=i;
}
int t;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
int n;
scanf("%d",&n);
int res=0;
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&t);
for(int j=1;j<=cnt;j++)
{
int k=prime[j]*prime[j];
if(t<k) break;
while(t%(k)==0)
{
t/=k;
}
}
a[t]++;
}
for(int i=1;i<=1000000;i++)
{
res+=(a[i]*(a[i]-1))/2;
}
printf("%d\n",res);
}
return 0;
}