Problem:
Score : 600 points

Problem Statement

Find the number of sequences of length K consisting of positive integers such that the product of any two adjacent elements is at most N, modulo 10^9+7.

Constraints

1\leq N\leq 10^9

1 2\leq K\leq 100 (fixed at 21:33 JST)

N and K are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the number of sequences, modulo 10^9+7.

Sample Input 1

3 2

Sample Output 1

5

(1,1), (1,2), (1,3), (2,1), and (3,1) satisfy the condition.

Sample Input 2

10 3

Sample Output 2

147

Sample Input 3

314159265 35

Sample Output 3

457397712

Solution in C (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <assert.h>

#define MOD 1000000007

int dp[2][101][100001];

int isqrt(long long int x) {
	long long int a = x, b = (x+1)/2;
	while (a > b) {
		a = b;
		b = (a + x/a)/2;
	}
	return a;
}

int main(void) {
	long long int n;
	int k;
	scanf("%lld%d", &n, &k);

	int sqrt = isqrt(n)+1;

	dp[0][0][1] = 1;
	for (int i = 0; i < k; i++) {
		for (int j = 1; j < sqrt; j++) {
			dp[0][i][j] += dp[0][i][j-1];
			dp[0][i][j] %= MOD;
		}
		for (int j = 1; j < sqrt-1; j++) {
			dp[1][i][sqrt-j-1] += dp[1][i][sqrt-j];
			dp[1][i][sqrt-j-1] %= MOD;
		}

		for (int j = 1; j < sqrt; j++) {
			dp[0][i+1][j] = dp[0][i][sqrt-1] + dp[1][i][j];
			dp[0][i+1][j] %= MOD;

			if (n/j != j) {
				dp[1][i+1][j] = ((long long int) dp[0][i][j] * (n/j - n/(j+1))) % MOD;
			}
		}

	}

	int ans = 0;
	for (int i = 0; i < sqrt; i++) {
		ans = (ans + dp[0][k][i]) % MOD;
		ans = (ans + dp[1][k][i]) % MOD;
	}

	printf("%d\n", ans);
}