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 PyPy2 (5.6.0) (judge verdict: Wrong Answer)

import math
import collections

p_max = int(10**(10./3))

marked = [True]*2+[False]*(p_max-2)
ps = []

for n in range(2,p_max):
    if marked[n]:
        continue
    ps.append(n)
    for n2 in range(n, p_max):
        if n2 % n == 0:
            marked[n2] = True

def getexp(n, p):
    ans = 0
    while n > 1 and n % p == 0:
        ans += 1
        n = n // p
    return ans

def getcanon(n):
    canon = []
    for p in ps:
        if n == 1:
            return tuple(canon)
        e = getexp(n, p)
        n = n//(p**e)
        if e % 3 != 0:
            canon.append((p, e % 3))
    sqr = int(math.sqrt(n+0.5))
    if sqr**2 == n:
        canon.append((sqr, 2))
    else:
        canon.append((n,1))
    return tuple(canon)

def getcomp(canon):
    return tuple([(p,3-e) for (p,e) in canon])


N = int(raw_input())
s = [int(raw_input()) for i in range(N)]

ctr = collections.Counter()

for si in s:
    ctr[getcanon(si)] += 1

ans = 0

cans = list(ctr.keys())

for can in cans:
    ct = ctr[can]
    if ct == 0:
        continue
    if can == ():
        ans += 1
        ctr[can] = 0
        continue
    comp = getcomp(can)
    c_ct = ctr[comp]
    if c_ct == 0:
        ans += ct
    else:
        ans += max(ct, c_ct)
        ctr[comp] = 0



print ans