Problem:
Score : 1100 points

Problem Statement

Snuke got positive integers s_1,...,s_N from his mother, as a birthday present. There may be duplicate elements.

He will circle some of these N integers. Since he dislikes cubic numbers, he wants to ensure that if both s_i and s_j (i ≠ j) are circled, the product s_is_j is not cubic. For example, when s_1=1,s_2=1,s_3=2,s_4=4, it is not possible to circle both s_1 and s_2 at the same time. It is not possible to circle both s_3 and s_4 at the same time, either.

Find the maximum number of integers that Snuke can circle.

Constraints

1 ≦ N ≦ 10^5

1 ≦ s_i ≦ 10^{10}

All input values are integers.

Input

The input is given from Standard Input in the following format:

N
s_1
:
s_N

Output

Print the maximum number of integers that Snuke can circle.

Sample Input 1

8
1
2
3
4
5
6
7
8

Sample Output 1

6

Snuke can circle 1,2,3,5,6,7.

Sample Input 2

6
2
4
8
16
32
64

Sample Output 2

3

Sample Input 3

10
1
10
100
1000000007
10000000000
1000000009
999999999
999
999
999

Sample Output 3

9

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <stdio.h>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;

typedef pair<long long,long long> numtype;

numtype normalize(long long x){
	long long p=1,q=1;
	for(long long d=2;d*d<=x;d++){
		int cnt=0;
		for(;x%d==0;){x/=d;cnt++;}
		if(cnt%3==1)p*=d;
		if(cnt%3==2)q*=d;
	}
	if(x>1)p*=x;
	return make_pair(p,q);
}

numtype inv(numtype x){
	return make_pair(x.second,x.first);
}

bool istriv(numtype x){return x==make_pair(1LL,1LL);}

main(){
	int n;
	scanf("%d",&n);
	vector<long long> aa(n);
	
	for(int i=0;i<n;i++)scanf("%lld",&aa[i]);

	vector<numtype> a(n);
	map<numtype,int> cnt;
	for(int i=0;i<n;i++)a[i]=normalize(aa[i]);
	for(int i=0;i<n;i++)cnt[a[i]]++;

	//for(int i=0;i<n;i++)printf("%lld %lld\n",a[i].first,a[i].second);
	
	int ans=0;
	
	for(map<numtype,int>::iterator ite=cnt.begin();ite!=cnt.end();ite++){
		numtype d=(*ite).first;
		if(istriv(d)){
			ans++;
		}else{
			numtype dd=inv(d);
			if(cnt.count(dd)==0 || d<dd){
				ans+=max(cnt[d],cnt[dd]);
			}
		}
	}
	printf("%lld\n",ans);
}