与另一道平方数雷同 这道立方数。。。同平方数那题 筛掉立方数,卡在匹配,与平方数不同的地方就是匹配,平方数与自己匹配即可,这个需要找到对应的匹配数
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#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 == 1) break;
}
}
}
int main()
{
Init();
int i,f;
int t,n,x,sum;
LL pp,z;
scanf("%d",&t);
while(t--)
{
sum = 0;
memset(p,0,sizeof(p));
scanf("%d",&n);
while(n--)
{
pp = 1;
z = 1;
f = 1;
scanf("%d",&x);
for(i = 0; i < tp && pm[i] <= x; ++i)
{
if(x%pm[i]) continue;
LL w = pm[i]*pm[i]*pm[i];
while(x%w == 0)
{
x /= w;
}
if(x%pm[i]) continue;
if(x%(pm[i]*pm[i]))
{
x = x/pm[i];
pp *= pm[i];
if(f)
z = z*pm[i]*pm[i];
}
else
{
x = x/(pm[i]*pm[i]);
pp = pp*pm[i]*pm[i];
if(f)
z *= pm[i];
}
if(z > 1000000) f = 0;
}
if(f)
{
if(x != 1) z = z*x*x;
if(z <= 1000000)
sum += p[z];
}
if(x != 1) pp = pp*x;
p[pp]++;
}
printf("%d\n",sum);
}
return 0;
}