#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
 
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<ll> vi;
typedef unsigned long long ull;
typedef long double ld; 
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;

struct NumberTheory
{
	vector<ll> primes;
	vector<bool> prime;
	vector<ll> totient;
	vector<ll> sumdiv;
	vector<ll> bigdiv;
	void Sieve(ll n)
	{
		prime.assign(n+1, 1);
		prime[1] = false;
		for(ll i = 2; i <= n; i++)
		{
			if(prime[i])
			{
				primes.pb(i);
				for(ll j = i*2; j <= n; j += i)
				{
					prime[j] = false;
				}
			}
		}
	}
	
	ll phi(ll x)
	{
		map<ll,ll> pf;
		ll num = 1; ll num2 = x;
		for(ll i = 0; primes[i]*primes[i] <= x; i++)
		{
			if(x%primes[i]==0)
			{
				num2/=primes[i];
				num*=(primes[i]-1);
			}
			while(x%primes[i]==0)
			{
				x/=primes[i];
				pf[primes[i]]++;
			}
		}
		if(x>1)
		{
			pf[x]++; num2/=x; num*=(x-1);
		}
		x = 1;
		num*=num2;
		return num;
	}
	
	bool isprime(ll x)
	{
		if(x==1) return false;
		for(ll i = 0; primes[i]*primes[i] <= x; i++)
		{
			if(x%primes[i]==0) return false;
		}
		return true;
	}

	void SievePhi(ll n)
	{
		totient.resize(n+1);
		for (int i = 1; i <= n; ++i) totient[i] = i;
		for (int i = 2; i <= n; ++i)
		{
			if (totient[i] == i)
			{
				for (int j = i; j <= n; j += i)
				{
					totient[j] -= totient[j] / i;
				}
			}
		}
	}
	
	void SieveSumDiv(ll n)
	{
		sumdiv.resize(n+1);
		for(int i = 1; i <= n; ++i)
		{
			for(int j = i; j <= n; j += i)
			{
				sumdiv[j] += i;
			}
		}
	}
	
	ll getPhi(ll n)
	{
		return totient[n];
	}
	
	ll getSumDiv(ll n)
	{
		return sumdiv[n];
	}
	
	ll modpow(ll a, ll b, ll mod)
	{
		ll r = 1;
		if(b < 0) b += mod*100000LL;
		while(b)
		{
			if(b&1) r = (r*a)%mod;
			a = (a*a)%mod;
			b>>=1;
		}
		return r;
	}
	
	ll inv(ll a, ll mod)
	{
		return modpow(a, mod - 2, mod);
	}
	
	ll invgeneral(ll a, ll mod)
	{
		ll ph = phi(mod);
		ph--;
		return modpow(a, ph, mod);
	}
	
	void getpf(vector<ii>& pf, ll n)
	{
		for(ll i = 0; primes[i]*primes[i] <= n; i++)
		{
			int cnt = 0;
			while(n%primes[i]==0)
			{
				n/=primes[i]; cnt++;
			}
			if(cnt>0) pf.pb(ii(primes[i], cnt));
		}
		if(n>1)
		{
			pf.pb(ii(n, 1));
		}
	}

	//ll op;
	void getDiv(vector<ll>& div, vector<ii>& pf, ll n, int i)
	{
		//op++;
		ll x, k;
		if(i >= pf.size()) return ;
		x = n;
		for(k = 0; k <= pf[i].se; k++)
		{
			if(i==int(pf.size())-1) div.pb(x);
			getDiv(div, pf, x, i + 1);
			x *= pf[i].fi;
		}
	}
};

NumberTheory nt;
map<ll,int> ma;
map<ll,ll> comple;
const ll C = ll(1e10)+111;

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	nt.Sieve(111111);
	int n; cin>>n;
	int ans=0;
	for(int z=0;z<n;z++)
	{
		ll x; cin>>x;
		vector<ii> vec;
		for(int i=0;nt.primes[i]*1LL*nt.primes[i]*nt.primes[i]<=C;i++)
		{
			ll c = nt.primes[i]*1LL*nt.primes[i]*nt.primes[i];
			while(x%c==0)
			{
				x/=c;
			}
		}
		ll orix=x;
		for(int i=0;nt.primes[i]*1LL*nt.primes[i]*nt.primes[i]<=C;i++)
		{
			int cnt=0;
			while(x%nt.primes[i]==0)
			{
				x/=nt.primes[i];
				cnt++;
			}
			if(cnt>0) vec.pb({nt.primes[i],cnt});
		}
		//compute complement of x, all pf > cube root of C, so at most 2 pf here
		//if the 2 pf are distinct, then it's a free take
		ll sqt = floor(sqrt(ld(x)));
		ll SQRT=-1;
		for(ll i=sqt-2;i<=sqt+2;i++)
		{
			if(i*i==x)
			{
				SQRT = i;
			}
		}
		if(x==1)
		{
			
		}
		else if(x<111000)
		{
			vec.pb({x,1}); x=1;
		}
		else if(SQRT>0&&nt.prime[SQRT])
		{
			vec.pb({SQRT,2}); x=1;
		}
		else
		{
			ans++; continue;
		}
		ll as=1;
		for(pair<ll,ll> z:vec)
		{
			for(int i=0;i<3-z.se;i++)
			{
				as*=z.fi;
				if(as>C) as=C+1;
			}
		}	
		comple[orix]=as;
		ma[orix]++;
	}
	if(ma[1]>0)
	{
		ans++;
	}
	for(auto X:ma)
	{
		ll val = X.fi; ll ct = X.se;
		if(val==1) continue;
		ll com = comple[val];
		ll cntcom = (ma.find(com)!=ma.end()?ma[com]:0);
		if(val<com||cntcom==0)
		{
			ans+=max(cntcom,ct);
		}
	}
	cout<<ans<<'\n';
}


Measured memory_bytes: 10752