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 javax.xml.stream.events.Characters;

import java.io.*;

public class Main{

	static int mod=(int)1e9+7;
	
	public static void main(String[] args) throws IOException {
		PrintWriter out=new PrintWriter(System.out);
		Reader in=new Reader(System.in);	
		int ts=1;
//		ts=in.nextInt();
		outer: while(ts-->0) {
			
			
			int n=in.nextInt();
			int k=in.nextInt();
			int dp[][]=new int[n+1][k+1];
			for(int i=0; i<=n; ++i) dp[i][1]=1;
			for(int j=0; j<=k; ++j) dp[1][j]=1;
			//dp[i][j] = number of good sequences with length j and last 
			//number i;
			//base case: dp[1][j] = 1, dp[i][1]=1;
			//dp[i][j] = dp[i/x][j-1],  x=1,2,3,4,...
			Set<Integer> st[]=new HashSet[n+1];
			for(int i=0; i<=n; ++i) st[i]=new HashSet<>();
			for(int i=2; i<=n; ++i) {
				for(int j=1; j*j<=i; ++j) {
					if(i%j==0) {
						st[i].add(j);
						st[i].add(i/j);
					}
				}
			}
			for(int i=2; i<=n; ++i) {
				
				for(int j=2; j<=k; ++j) {
					
					for(int t: st[i]) {
						dp[i][j]+=dp[i/t][j-1];
						dp[i][j]%=mod;
					}
					
				}
				
			}
			
			long ans=0;
			for(int i=1; i<=n; ++i) {
				ans+=dp[i][k];
				ans%=mod;
			}
			out.println(ans);
				
		}
		out.close();	
	}
	
	static long ans=0;
		
	static void sort(int [] a) {
		List<Integer> l=new ArrayList<>();
		for(int i: a) l.add(i);
		Collections.sort(l);
		for(int i=0; i<a.length; i++) a[i]=l.get(i);
	}
	
	static class Reader{
		BufferedReader br;
		StringTokenizer to;
		Reader(InputStream stream){
			br=new BufferedReader(new InputStreamReader(stream));
			to=new StringTokenizer("");
		}
		String next() {
			while(!to.hasMoreTokens()) {
				try {
					to=new StringTokenizer(br.readLine());	
				}catch(IOException e) {}
				
			}
			return to.nextToken();
		}
		int nextInt() {
			return Integer.parseInt(next());
		}
		long nextLong() {
			return Long.parseLong(next());
		}
		
		int [] readArray(int n) {
			int a[]=new int[n];
			for(int i=0; i<n; i++) a[i]=nextInt();
			return a;
		}
	}	
	
}