#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll U=1e10;
map<ll,int> cnt;
map<ll,ll> inv;
const int N=1e5+10;
int n,size,ans;ll q[N];
int prime[N],num;
void init(){
	static bool isp[N];
	for (int i=2;i<=10000;i++)
	if (!isp[i]){
		prime[++num]=i;
		for (int j=i+i;j<=10000;j+=i) isp[j]=1;
	}
}
void insert(){
	ll x,v=1,I=1;
	scanf("%lld",&x);
	for (int i=1;i<=num&&(ll)prime[i]*prime[i]<=x;i++)
	if (x%prime[i]==0){
		int cnt=0,p=prime[i];
		while (x%p==0) cnt++,x/=p;
		cnt%=3;
		ll sqr=(ll)p*p;
		if (cnt==1){
			v*=p;
			if (I>U/sqr) I=U+1;else I*=sqr;
		}
		if (cnt==2){
			v*=sqr;
			if (I>U/p) I=U+1;else I*=p;
		}
	}
	v*=x;
	if (I>U/(x*x)) I=U+1;else I*=x*x;
	if (x<=1e8) inv[v]=I,inv[I]=v;else
	if (!inv.count(v)) inv[v]=I;
	cnt[q[++size]=v]++;
}
int main()
{
	init();
	scanf("%d",&n);
	for (int i=1;i<=n;i++) insert();
	int ans=0;
	if (cnt[1]) ans++,cnt[1]=0;
	for (int i=1;i<=size;i++){
		ll v=q[i];
		ans+=max(cnt[v],cnt[inv[v]]);
		cnt[v]=cnt[inv[v]]=0;
	}
	printf("%d\n",ans);
	return 0;
}