import java.util.ArrayList;

public class Euler797 {

    static final int MOD = 1000000007;

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

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

    static int solveFast(int N) {
        int[] lp = new int[N + 1];
        ArrayList<Integer> primes = new ArrayList<>();
        byte[] mu = new byte[N + 1];
        mu[1] = 1;

        for (int i = 2; i <= N; ++i) {
            if (lp[i] == 0) {
                lp[i] = i;
                primes.add(i);
                mu[i] = -1;
            }
            for (int p : primes) {
                long v = (long) p * (long) i;
                if (v > N) {
                    break;
                }
                lp[(int) v] = p;
                if (p == lp[i]) {
                    mu[(int) v] = 0;
                    break;
                }
                mu[(int) v] = (byte) -mu[i];
            }
        }

        int[] mertensMod = new int[N + 1];
        for (int i = 1; i <= N; ++i) {
            int v = mertensMod[i - 1] + mu[i];
            if (v >= MOD)
                v -= MOD;
            if (v < 0)
                v += MOD;
            mertensMod[i] = v;
        }

        int[] base = new int[N + 1];
        int p2 = 1;
        for (int i = 1; i <= N; ++i) {
            p2 = modMul(p2, 2);
            int v = p2 - 1;
            if (v < 0)
                v += MOD;
            base[i] = v;
        }

        int[] invBase = new int[N + 1];
        invBase[0] = 1;
        for (int i = 1; i <= N; ++i) {
            invBase[i] = modMul(invBase[i - 1], base[i]);
        }

        int invPref = modPow(invBase[N], MOD - 2);
        for (int i = N; i >= 1; --i) {
            invBase[i] = modMul(invPref, invBase[i - 1]);
            invPref = modMul(invPref, base[i]);
        }

        int[] phi2 = new int[N + 1];
        for (int i = 1; i <= N; ++i)
            phi2[i] = 1;

        for (int k = 1; k <= N; ++k) {
            int muk = mu[k];
            if (muk == 0)
                continue;

            int limit = N / k;
            int n = k;
            if (muk > 0) {
                for (int m = 1; m <= limit; ++m, n += k) {
                    phi2[n] = modMul(phi2[n], base[m]);
                }
            } else {
                for (int m = 1; m <= limit; ++m, n += k) {
                    phi2[n] = modMul(phi2[n], invBase[m]);
                }
            }
        }

        int[] F = new int[N + 1];
        for (int i = 1; i <= N; ++i)
            F[i] = 1;

        for (int d = 1; d <= N; ++d) {
            int factor = phi2[d] + 1;
            if (factor >= MOD)
                factor -= MOD;
            for (int n = d; n <= N; n += d) {
                F[n] = modMul(F[n], factor);
            }
        }

        int ans = 0;
        for (int n = 1; n <= N; ++n) {
            ans = (int) ((ans + (long) F[n] * (long) mertensMod[N / n]) % MOD);
        }

        return ans;
    }

    public static String solve() {
        return Integer.toString(solveFast(10000000));
    }

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