Problem: Mashmokh's boss, Bimokh, didn't like Mashmokh. So he fired him. Mashmokh decided to go to university and participate in ACM instead of finding a new job. He wants to become a member of Bamokh's team. In order to join he was given some programming tasks and one week to solve them. Mashmokh is not a very experienced programmer. Actually he is not a programmer at all. So he wasn't able to solve them. That's why he asked you to help him with these tasks. One of these tasks is the following.

A sequence of l integers b1, b2, ..., bl (1 ≤ b1 ≤ b2 ≤ ... ≤ bl ≤ n) is called good if each number divides (without a remainder) by the next number in the sequence. More formally <image> for all i (1 ≤ i ≤ l - 1).

Given n and k find the number of good sequences of length k. As the answer can be rather large print it modulo 1000000007 (109 + 7).

Input

The first line of input contains two space-separated integers n, k (1 ≤ n, k ≤ 2000).

Output

Output a single integer — the number of good sequences of length k modulo 1000000007 (109 + 7).

Examples

Input

3 2


Output

5


Input

6 4


Output

39


Input

2 1


Output

2

Note

In the first sample the good sequences are: [1, 1], [2, 2], [3, 3], [1, 2], [1, 3].

Solution (in JAVA):

Solution:

import java.util.*;
import java.io.*;

public class Codeforces {

    static long dp[][];
    static int mod = 1000000007;
    
      public static void main(String[] args) throws IOException{
        Reader.init(System.in);
        int n = Reader.nextInt(), k = Reader.nextInt();
        dp = new long[k][n];
        ArrayList<Integer> div[] = new ArrayList[n];
        
        for(int i = 0; i < n; i++)
            div[i] = new ArrayList<>();
        
        for(int i = 1; i <= n; i++){
            for(int j = i; j <= n; j+= i)
                div[j-1].add(i-1);
        }
        
        for(int i = 0; i < n; i++)
            dp[0][i] = 1;
        
        for(int i = 1; i < k; i++){
            for(int j = 0; j < n; j++){
                for(int s = 0; s < div[j].size(); s++){
                    dp[i][j] += dp[i-1][div[j].get(s)];
                    dp[i][j] %= mod; 
                }
            }
        }
        
        long ans = 0;
        for(int i = 0; i < n; i++)
            ans =  (ans + dp[k-1][i]) % mod;
        System.out.println(ans);
    }
    
}

class Pair implements Comparable<Pair> {

    long a;
    int b;

    @Override
    public int compareTo(Pair t) {
        long x = this.a - t.a;

        if (x == 0) {
            return this.b - t.b;
        }

        return (int) x;
    }

    public Pair(long a, int b) {
        this.a = a;
        this.b = b;
    }

}

class Reader {

    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /**
     * call this method to initialize reader for InputStream
     */
    public static int pars(String x) {
        int num = 0;
        int i = 0;
        if (x.charAt(0) == '-') {
            i = 1;
        }
        for (; i < x.length(); i++) {
            num = num * 10 + (x.charAt(i) - '0');
        }

        if (x.charAt(0) == '-') {
            return -num;
        }

        return num;
    }

    static void init(InputStream input) {
        reader = new BufferedReader(
                new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    }
    
    static void init(FileReader input) {
        reader = new BufferedReader(input);
        tokenizer = new StringTokenizer("");
    }

    /**
     * get next word
     */
    static String next() throws IOException {
        while (!tokenizer.hasMoreTokens()) {
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(
                    reader.readLine());
        }
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException {
        return pars(next());
    }

    static byte nextByte() throws IOException {

        return Byte.parseByte(next());
    }

    static long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    static double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }
}