给出一个序列,求其中乘积是平方数的数对个数。
解法:将每个数的平方因子筛掉,得到新数,然后排序,统计相同的个数num,结果累加num*(num-1)./2就好了。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int p[1000],cnt=0,a[100005];
bool judge(int x)
{
if(x==2) return 1;
for(int i=2;i*i<=x;++i)
if(x%i==0) return 0;
return 1;
}
void init()
{
for(int i=2;i<=1000;++i)
if(judge(i)) p[cnt++]=i;
}
int change(int x)
{
for(int i=0;i<cnt&&p[i]*p[i]<=x;++i)
while(x%(p[i]*p[i])==0) x/=(p[i]*p[i]);
return x;
}
int main()
{
int n;
int i,t;
init();
cin>>t;
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;++i)
{
scanf("%d",&a[i]);
a[i]=change(a[i]);
}
sort(a,a+n);
long long ans=0;
for(i=0;i<n;++i)
{
int tem=a[i],num=0;
while(a[i]==tem)
{
++num;
++i;
}
ans+=(num-1)*num/2;
--i;
}
printf("%lld\n",ans);
}
return 0;
}
/**************************************
Problem id : SDUT OJ 3258
User name : hahahaha
Result : Accepted
Take Memory : 876K
Take Time : 320MS
Submit Time : 2015-05-25 16:42:38
**************************************/