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.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class TestTask {
	static long MOD = (long)1e9+7;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		FastReader sc = new FastReader();
		PrintWriter out = new PrintWriter(System.out);
		
		int test = 1;
		while(test-->0) {
			int n = sc.nextInt();
			int k = sc.nextInt();
			
			ArrayList<Long>[] divs = new ArrayList[n+1];
			for(int i = 1;i<=n;i++) {
				for(int j = i;j<=n;j+=i) {
					if(divs[j]==null) {
						divs[j] = new ArrayList<Long>();
					}
					divs[j].add((long)i);
				}
			}
			long[][] dp = new long[k+1][n+1];
			dp[1][1] = 1;
			long answer = 0;
			for(int i = 1;i<=k;i++) {
				for(int j = 1;j<=n;j++) {
					if(i<=1) {
						dp[i][j]=1;
						if(i==k)answer++;
						continue;
					}
					for(long a : divs[j]) {
						dp[i][j] = dp[i][j]+dp[i-1][(int)a];
					}
					dp[i][j]%=MOD;
					if(i==k) {
						answer+=dp[i][j];
						answer%=MOD;
					}
					
				}
			}
			out.println(answer);
		}
		out.close();
	}
	static class FastReader {
		
		StringTokenizer st;
		BufferedReader br;
		
		public FastReader() {
			br = new BufferedReader(
					new InputStreamReader(System.in));
		}
		
		String next() {
			while(st==null || !st.hasMoreElements()) {
				try {
					st = new StringTokenizer(br.readLine());
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}
		
		int nextInt() {
			return Integer.parseInt(next());
		}
		
		long nextLong() {
			return Long.parseLong(next());
		}
		
		double nextDouble() { 
			return Double.parseDouble(next()); 
		} 
		
		String nextLine() {
			String s = "";
			while(st==null || st.hasMoreElements()) {
				try {
					s = br.readLine();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return s;
		}
	}	
}