#include<bits/stdc++.h>
typedef long long i64;
const int N=1e5+7;
const i64 MX=1e12;
int n,ps[555],vp=0,ans=0;
i64 a[N];
bool np[2207];
struct pos{
	i64 a,b;
	int t;
	bool operator<(const pos&w)const{return a!=w.a?a<w.a:b!=w.b?b<w.b:t<w.t;}
	bool eq(const pos&w)const{return a==w.a&&b==w.b&&t==w.t;}
	bool eqx(const pos&w)const{return a==w.a&&b==w.b;}
}vs[N];
int pp=0,d1=0;
void ins(i64 v1,i64 v2){
	int z=v1>v2;
	if(z)std::swap(v1,v2);
	vs[vp++]=(pos){v1,v2,z};
}
int main(){
	for(int i=2;i<=2200;++i){
		if(!np[i])ps[pp++]=i;
		for(int j=0,k;j<pp&&(k=i*ps[j])<=2200;++j){
			np[k]=1;
			if(i%ps[j]==0)break;
		}
	}
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		i64 x,v1=1,v2=1;
		scanf("%lld",&x);
		for(int j=0;j<pp;++j)if(x%ps[j]==0){
			int t=0;
			do x/=ps[j],++t;while(x%ps[j]==0);
			t%=3;
			if(t==1)v1*=ps[j],v2*=ps[j]*ps[j];
			else if(t==2)v1*=ps[j]*ps[j],v2*=ps[j];
		}
		i64 v=sqrt(x);
		if(v*v==x){
			v1*=x;
			v2*=v;
			if(v1==1&&v2==1)d1=1;
			else ins(v1,v2);
		}else if(MX/x/x>=v2)ins(v1*x,v2*x*x);
		else ++ans;
	}
	std::sort(vs,vs+vp);
	for(int i=0,j=0;i<vp;i=j){
		for(;j<vp&&vs[j].eq(vs[i]);++j);
		int c1=j-i,c2=-j;
		for(;j<vp&&vs[j].eqx(vs[i]);++j);
		c2+=j;
		ans+=std::max(c1,c2);
	}
	printf("%d\n",ans+d1);
	return 0;
}