先求出末尾为i的前一个可能是哪些数(即所有能整除i的数) ,再dp
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
typedef long long LL;
const int MOD=1e9+7,N=2002;
vector<int> vec[N];
LL dp[N][N];//长度为i,末尾为j的good数量
int main(){
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
if(i%j==0)
vec[i].push_back(j);
dp[0][1]=1;
for(int i=1;i<=k;i++){//长度
for(int j=1;j<=n;j++){//末尾
int sz=vec[j].size();
for(int k=0;k<sz;k++){//good的前一个
dp[i][j]=(dp[i][j]+dp[i-1][vec[j][k]])%MOD;
}
}
}
LL ans=0;
for(int i=1;i<=n;i++)
ans=(ans+dp[k][i])%MOD;
cout<<ans<<endl;
return 0;
}