import java.util.ArrayList;
import java.util.List;

public class Euler606 {
    static final long MOD = 1000000000L;

    static long addMod(long a, long b) {
        long s = a + b;
        if (s >= MOD)
            s -= MOD;
        return s;
    }

    static long subMod(long a, long b) {
        return (a >= b) ? (a - b) : (a + MOD - b);
    }

    static long mulMod(long a, long b) {
        return (a * b) % MOD;
    }

    static long sumCubesMod(long n) {
        long tm = 0;
        if (n % 2 == 0) {
            tm = (n / 2 % MOD) * ((n + 1) % MOD) % MOD;
        } else {
            tm = (n % MOD) * ((n + 1) / 2 % MOD) % MOD;
        }
        return mulMod(tm, tm);
    }

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

    public static String solve() {
        long X = 1000000000000L;
        long sq = (long) Math.sqrt(X);
        List<Long> primes = sievePrimes(sq);

        List<Long> vals = new ArrayList<>();
        for (long l = 1; l <= X;) {
            long w = X / l;
            vals.add(w);
            l = X / w + 1;
        }

        int m = vals.size();
        long[] g = new long[m];
        int[] id1 = new int[(int) sq + 1];
        int[] id2 = new int[(int) sq + 1];

        for (int i = 0; i < m; i++) {
            long w = vals.get(i);
            g[i] = subMod(sumCubesMod(w), 1);
            if (w <= sq) {
                id1[(int) w] = i;
            } else {
                id2[(int) (X / w)] = i;
            }
        }

        long[] prefP3 = new long[primes.size() + 1];
        for (int i = 0; i < primes.size(); i++) {
            long p = primes.get(i);
            long p3 = p * p % MOD * p % MOD;
            prefP3[i + 1] = addMod(prefP3[i], p3);
        }

        for (int i = 0; i < primes.size(); i++) {
            long p = primes.get(i);
            long p2 = p * p;
            if (p2 > X)
                break;
            long p3 = p * p % MOD * p % MOD;

            for (int j = 0; j < m; j++) {
                long w = vals.get(j);
                if (w < p2)
                    break;
                long x = w / p;
                int idx = (x <= sq) ? id1[(int) x] : id2[(int) (X / x)];
                long term = subMod(g[idx], prefP3[i]);
                g[j] = subMod(g[j], mulMod(p3, term));
            }
        }

        long ans = 0;
        for (int i = 0; i < primes.size(); i++) {
            long p = primes.get(i);
            long lim = X / p;
            if (lim <= p)
                break;

            int idxLim = (lim <= sq) ? id1[(int) lim] : id2[(int) (X / lim)];
            int idxP = (p <= sq) ? id1[(int) p] : id2[(int) (X / p)];

            long sumQ = subMod(g[idxLim], g[idxP]);
            long p3 = p * p % MOD * p % MOD;
            ans = addMod(ans, mulMod(p3, sumQ));
        }

        return String.format("%09d", ans);
    }

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