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++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;

constexpr int64_t mod = 1'000'000'007;

int main(){
    int n, k;
    cin >> n >> k;
    int64_t sqn;
    for(sqn=1;sqn*sqn<=n;++sqn);
    --sqn;

    vector<int64_t> rg(2*sqn);
    for(int i=1;i<=sqn;++i){
        rg[i-1] = i;
        rg[2*sqn-i] = n/i;
    }

    static int64_t dp[100000][100];    
    dp[0][0] = 1;
    for(int i=1;i<2*sqn;++i){
        dp[i][0] = (rg[i]-rg[i-1]) % mod;
        dp[i][0] = (dp[i][0] + dp[i-1][0]) % mod;
    }
    for(int kk=1;kk<k;++kk){
        dp[0][kk] = dp[2*sqn-1][kk-1] % mod;
        for(int i=1;i<2*sqn;++i){
            int ok=0, ng=2*sqn;
            while(ng-ok>1){
                int64_t mid = (ok+ng)/2;
                if(rg[i]*rg[mid] <= n) ok = mid;
                else ng = mid;
            }
            dp[i][kk] = dp[ok][kk-1] * (rg[i]-rg[i-1]) % mod;
            dp[i][kk] = (dp[i][kk] + dp[i-1][kk]) % mod;
        }
    }

    cout << dp[2*sqn-1][k-1] << endl;
    
    return 0;
}