import java.util.ArrayList;

public class Euler650 {
    static final long kMod = 1000000007L;

    static long modPow(long a, long e) {
        long r = 1 % kMod;
        while (e > 0) {
            if ((e & 1) != 0)
                r = (r * a) % kMod;
            a = (a * a) % kMod;
            e >>= 1;
        }
        return r;
    }

    static class Sieve {
        int n;
        ArrayList<Integer> primes;
        int[] spf;

        Sieve(int n) {
            this.n = n;
            primes = new ArrayList<>();
            spf = new int[n + 1];
            for (int i = 2; i <= n; ++i) {
                if (spf[i] == 0) {
                    spf[i] = i;
                    primes.add(i);
                }
                for (int p : primes) {
                    if (p > spf[i] || (long) i * p > n)
                        break;
                    spf[i * p] = p;
                }
            }
        }
    }

    public static String solve() {
        int N = 20000;
        Sieve sv = new Sieve(N);
        int P = sv.primes.size();

        int[] pidx = new int[N + 1];
        java.util.Arrays.fill(pidx, -1);
        for (int i = 0; i < P; ++i) {
            pidx[sv.primes.get(i)] = i;
        }

        long[] invp = new long[P];
        long[] invpm1 = new long[P];
        for (int i = 0; i < P; ++i) {
            long p = sv.primes.get(i);
            invp[i] = modPow(p % kMod, kMod - 2);
            invpm1[i] = modPow((p - 1) % kMod, kMod - 2);
        }

        long[] invPowA = new long[P];
        java.util.Arrays.fill(invPowA, 1L);
        long[] powE1 = new long[P];
        for (int i = 0; i < P; ++i) {
            powE1[i] = sv.primes.get(i) % kMod;
        }

        long S = 0;

        for (int n = 1; n <= N; ++n) {
            for (int i = 0; i < P; ++i) {
                powE1[i] = (powE1[i] * invPowA[i]) % kMod;
            }

            int x = n;
            while (x > 1) {
                int p = sv.spf[x];
                int v = 0;
                while (x % p == 0) {
                    x /= p;
                    ++v;
                }
                int i = pidx[p];
                long addE = (long) (n - 1) * v;
                if (addE > 0) {
                    powE1[i] = (powE1[i] * modPow(p, addE)) % kMod;
                }
                invPowA[i] = (invPowA[i] * modPow(invp[i], v)) % kMod;
            }

            long D = 1;
            for (int i = 0; i < P; ++i) {
                long t = powE1[i];
                long num = (t + kMod - 1) % kMod;
                long term = (num * invpm1[i]) % kMod;
                D = (D * term) % kMod;
            }

            S = (S + D) % kMod;
        }

        return Long.toString(S);
    }

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