import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Euler616 {
    static boolean isPrimeInt(int x) {
        if (x < 2)
            return false;
        if (x % 2 == 0)
            return x == 2;
        for (int d = 3; (long) d * d <= x; d += 2) {
            if (x % d == 0)
                return false;
        }
        return true;
    }

    static List<Integer> sievePrimes(int n) {
        boolean[] isPrime = new boolean[n + 1];
        for (int i = 2; i <= n; i++)
            isPrime[i] = true;
        for (int p = 2; (long) p * p <= n; p++) {
            if (isPrime[p]) {
                for (int j = p * p; j <= n; j += p) {
                    isPrime[j] = false;
                }
            }
        }
        List<Integer> primes = new ArrayList<>();
        for (int i = 2; i <= n; i++) {
            if (isPrime[i])
                primes.add(i);
        }
        return primes;
    }

    static boolean powLeq(long a, int e, long limit) {
        long r = 1;
        for (int i = 0; i < e; i++) {
            if (limit / a < r)
                return false;
            r *= a;
        }
        return true;
    }

    static long powExact(long a, int e) {
        long r = 1;
        for (int i = 0; i < e; i++) {
            r *= a;
        }
        return r;
    }

    static long floorRoot(long n, int e) {
        long lo = 1, hi = 1000000 + 1;
        while (lo + 1 < hi) {
            long mid = lo + (hi - lo) / 2;
            if (powLeq(mid, e, n)) {
                lo = mid;
            } else {
                hi = mid;
            }
        }
        return lo;
    }

    public static String solve() {
        long LIM = 1000000000000L;

        int maxE = 1;
        while (powLeq(2, maxE + 1, LIM))
            maxE++;

        Set<Long> perfect = new HashSet<>();
        for (int e = 2; e <= maxE; e++) {
            long maxA = floorRoot(LIM, e);
            for (long a = 2; a <= maxA; a++) {
                perfect.add(powExact(a, e));
            }
        }

        long sumPerfect = 0;
        for (long v : perfect) {
            sumPerfect += v;
        }

        int P_MAX = 1000000;
        List<Integer> primes = sievePrimes(P_MAX);
        List<Integer> expPrimes = new ArrayList<>();
        for (int e = 2; e <= maxE; e++) {
            if (isPrimeInt(e))
                expPrimes.add(e);
        }

        long sumPrimePrime = 0;
        for (int p : primes) {
            for (int e : expPrimes) {
                if (!powLeq(p, e, LIM))
                    break;
                sumPrimePrime += powExact(p, e);
            }
        }

        long ans = sumPerfect - sumPrimePrime - 16L;
        return Long.toString(ans);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
