Vivek initially has an empty array a and some integer constant m.

He performs the following algorithm:

  1. Select a random integer x uniformly in range from 1 to m and append it to the end of a. 
  2. Compute the greatest common divisor of integers in a. 
  3. In case it equals to 1, break 
  4. Otherwise, return to step 1. 



Find the expected length of a. It can be shown that it can be represented as P/Q where P and Q are coprime integers and Q≠ 0 \pmod{10^9+7}. Print the value of P ⋅ Q^{-1} \pmod{10^9+7}.

Input

The first and only line contains a single integer m (1 ≤ m ≤ 100000).

Output

Print a single integer — the expected length of the array a written as P ⋅ Q^{-1} \pmod{10^9+7}.

Examples

Input


1


Output


1


Input


2


Output


2


Input


4


Output


333333338

Note

In the first example, since Vivek can choose only integers from 1 to 1, he will have a=[1] after the first append operation, and after that quit the algorithm. Hence the length of a is always 1, so its expected value is 1 as well.

In the second example, Vivek each time will append either 1 or 2, so after finishing the algorithm he will end up having some number of 2's (possibly zero), and a single 1 in the end. The expected length of the list is 1⋅ 1/2 + 2⋅ (1)/(2^2) + 3⋅ (1)/(2^3) + … = 2.

import java.util.Arrays;

public class Main {


  private static void solve() {
    int m = ni();
    
    int mod = 1000000000 + 7;

    int[] primes = sieveEratosthenes(m + 1);

    long[] dp = new long[m + 1];

    long ret = 0;
    outer: for (int g = 2; g <= m; g ++) {
      dp[g] = f(m, g, mod);
      
      int[][] f = factor(g, primes);

        for (int[] v : f) {
          if (v[1] > 1) {
            continue outer;
          }
        }
        ret += dp[g] * (f.length % 2 == 1 ? 1 : (mod-1)) %mod;
        ret %=mod;
    }
    
    ret += inv(m, mod);
    ret %= mod;
    
    System.out.println(ret);

  }
  
  private static void dump(int mod) {
    for (int i = 1; i < 20; i ++) {
      for (int j = 1; j < 20; j ++) {
        System.out.println(i + " " + j + " " + inv(j, mod) * i % mod);
      }
    }
  }
  private static long f(long m, long g, int mod) {
    long a = (m/g) * inv(m, mod) % mod;
    long c = (m - (m/g) + mod) * inv(m/g, mod) % mod;
    
    long b = inv((mod-1+a) * (mod-1+a) % mod, mod) * a % mod;
    long ret = c * (mod + b - a) % mod;
    return ret;
  }
  
  public static long[][] enumDivisors(int[][] f)
  {
      int n = 1;
      for(int j = 0;j < f.length;j++){
          n *= f[j][1]+1;
      }
      long[][] divs = new long[n][2];
      int p = 1;
      divs[0][0] = 1;
      divs[0][1] = 1;
      for(int j = 0;j < f.length;j++){
          for(int q = p-1;q >= 0;q--){
              long b = divs[q][0];
              long s = -divs[q][1];
              for(int k = 0;k < f[j][1];k++){
                  b *= f[j][0];
//                if((long)b*b <= n)divs[p++] = b;
                  divs[p][1] = s;
                  divs[p++][0] = b;
                  s = -s;
              }
          }
      }
      long s = divs[n-1][1];
      for (int i = 0; i < n; i ++) {
        divs[i][1] *= s;
      }
      return divs;
  }
  
  public static int[][] factor(int n, int[] primes) {
    int[][] ret = new int[9][2];
    int rp = 0;
    for (int p : primes) {
      if (p * p > n)
        break;
      int i;
      for (i = 0; n % p == 0; n /= p, i++);
      if (i > 0) {
        ret[rp][0] = p;
        ret[rp][1] = i;
        rp++;
      }
    }
    if (n != 1) {
      ret[rp][0] = n;
      ret[rp][1] = 1;
      rp++;
    }
    return Arrays.copyOf(ret, rp);
  }

  public static int[] sieveEratosthenes(int n) {
    if (n <= 32) {
      int[] primes = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
      for (int i = 0; i < primes.length; i++) {
        if (n < primes[i]) {
          return Arrays.copyOf(primes, i);
        }
      }
      return primes;
    }

    int u = n + 32;
    double lu = Math.log(u);
    int[] ret = new int[(int) (u / lu + u / lu / lu * 1.5)];
    ret[0] = 2;
    int pos = 1;

    int[] isnp = new int[(n + 1) / 32 / 2 + 1];
    int sup = (n + 1) / 32 / 2 + 1;

    int[] tprimes = {3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
    for (int tp : tprimes) {
      ret[pos++] = tp;
      int[] ptn = new int[tp];
      for (int i = (tp - 3) / 2; i < tp << 5; i += tp)
        ptn[i >> 5] |= 1 << i;
      for (int j = 0; j < sup; j += tp) {
        for (int i = 0; i < tp && i + j < sup; i++) {
          isnp[j + i] |= ptn[i];
        }
      }
    }

    // 3,5,7
    // 2x+3=n
    int[] magic = {0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13, 31, 22, 28, 18, 26, 10,
        7, 12, 21, 17, 9, 6, 16, 5, 15, 14};
    int h = n / 2;
    for (int i = 0; i < sup; i++) {
      for (int j = ~isnp[i]; j != 0; j &= j - 1) {
        int pp = i << 5 | magic[(j & -j) * 0x076be629 >>> 27];
        int p = 2 * pp + 3;
        if (p > n)
          break;
        ret[pos++] = p;
        if ((long) p * p > n)
          continue;
        for (int q = (p * p - 3) / 2; q <= h; q += p)
          isnp[q >> 5] |= 1 << q;
      }
    }

    return Arrays.copyOf(ret, pos);
  }
  
  public static long inv(long a, int p)
  {
      long ret = 1;
      long mul = a;
      for(long n = p-2;n > 0;n >>>= 1){
          if((n&1)==1)ret = ret * mul % p;
          mul = mul * mul % p;
      }
      return ret;
  }
  
  public static long pow(long a, long n, long mod)
  {
      long ret = 1; // 1%mod if mod=1,n=0
      int x = 63-Long.numberOfLeadingZeros(n);
      for(;x >= 0;x--){
          ret = ret * ret % mod;
          if(n<<~x<0)ret = ret * a % mod;
      }
      return ret;
  }
  
  
  public static void main(String[] args) {
    new Thread(null, new Runnable() {
      @Override
      public void run() {
        long start = System.currentTimeMillis();
        String debug = args.length > 0 ? args[0] : null;
        if (debug != null) {
          try {
            is = java.nio.file.Files.newInputStream(java.nio.file.Paths.get(debug));
          } catch (Exception e) {
            throw new RuntimeException(e);
          }
        }
        reader = new java.io.BufferedReader(new java.io.InputStreamReader(is), 32768);
        solve();
        out.flush();
        tr((System.currentTimeMillis() - start) + "ms");
      }
    }, "", 64000000).start();
  }

  private static java.io.InputStream is = System.in;
  private static java.io.PrintWriter out = new java.io.PrintWriter(System.out);
  private static java.util.StringTokenizer tokenizer = null;
  private static java.io.BufferedReader reader;

  public static String next() {
    while (tokenizer == null || !tokenizer.hasMoreTokens()) {
      try {
        tokenizer = new java.util.StringTokenizer(reader.readLine());
      } catch (Exception e) {
        throw new RuntimeException(e);
      }
    }
    return tokenizer.nextToken();
  }

  private static double nd() {
    return Double.parseDouble(next());
  }

  private static long nl() {
    return Long.parseLong(next());
  }

  private static int[] na(int n) {
    int[] a = new int[n];
    for (int i = 0; i < n; i++)
      a[i] = ni();
    return a;
  }

  private static char[] ns() {
    return next().toCharArray();
  }

  private static long[] nal(int n) {
    long[] a = new long[n];
    for (int i = 0; i < n; i++)
      a[i] = nl();
    return a;
  }

  private static int[][] ntable(int n, int m) {
    int[][] table = new int[n][m];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        table[i][j] = ni();
      }
    }
    return table;
  }

  private static int[][] nlist(int n, int m) {
    int[][] table = new int[m][n];
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < m; j++) {
        table[j][i] = ni();
      }
    }
    return table;
  }

  private static int ni() {
    return Integer.parseInt(next());
  }

  private static void tr(Object... o) {
    if (is != System.in)
      System.out.println(java.util.Arrays.deepToString(o));
  }
}
