#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
#define ll long long
ll inline read()
{
ll num=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
return num*f;
}
int n,id,ans,flag,tot;ll a[N],X[N],Y[N];
bool vis[N];ll p[N];
void init()
{
for(int i=2;i<=2160;i++)
{
if(!vis[i])p[++tot]=i;
for(int j=1;i*p[j]<=2160;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0)break;
}
}
}
map<ll,int>t,used;
void split(ll x)
{
id++;ll sx=1,sy=1;
for(ll i=1,j=2;j*j*j<=x;i++,j=p[i])
{
ll b=j*j*j;
while(x%b==0)x/=b;
if(x%j==0){sy*=b;while(x%j==0)x/=j,sy/=j,sx*=j;}
}
if(x!=1)
{
ll m=sqrt(x);
if(m*m==x)sx*=x,sy*=m;
else sx*=x,sy*=(x<=100000ll)?x*x:0;
}
t[sx]++;X[id]=sx;Y[id]=sy;
}
int main(){
init();
n=read();
for(int i=1;i<=n;i++)split(a[i]=read());
for(int i=1;i<=n;i++)
{
if(X[i]==1){flag=1;continue;}
if(!used[X[i]]&&!used[Y[i]])
{
int num1=t[X[i]],num2=t[Y[i]];
if(num1<num2)ans+=num2,used[Y[i]]=1;
else ans+=num1,used[X[i]]=1;
}
}
printf("%d",flag+ans);
return 0;
}