一个数组里任选两个数求可以相乘为平方数的个数,数组的数据范围为100000,其中数组数值得数据范围为1000000;
示例输入
1
5
1 2 3 4 12
示例输出
2
1
5
1 2 3 4 12
示例输出
2
分析:一个数可以分为若干质因子相乘,
假设一个数是a*b^2,其中a无平方因子,那它要相乘得到一个完全平方数只能乘以一个a*c^2的数 ,那么在这
两个数的乘积中,b^2,c^2。并没有什么用处,所以除掉。将a放入桶中,计算桶中a的个数。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<math.h>
#include<queue>
#define ll long long
#define inf 1000010+10
#define MAX 1000010
using namespace std;
ll isp[1000010];
bool vis[1000010];
ll a[1000010];
ll top=0;
void ini()
{
memset(vis,false,sizeof(vis));
for(ll i=2;i*i<=MAX;i++)
{
if(!vis[i])
isp[top++]=i;
for(ll j=0;j<top&&isp[j]*i<=MAX;j++)
{
vis[isp[j]*i ]=true;
if(i%isp[j]==0)
break;
}
}
}
int main()
{
ll n,m,i,j,k;
ll cla,w,s;
ini();
scanf("%lld",&cla);
while(cla--)
{
s=0;
memset(a,0,sizeof(a));
scanf("%lld",&n);
while(n--)
{
scanf("%lld",&k);
for(i=0;i<top&&(w=isp[i]*isp[i])<=k;i++)
{
while(k%w==0)
{
k/=w;
}
}
s+=a[k];
a[k]++;
}
printf("%lld\n",s);
}
return 0;
}