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 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).
The first line of input contains two space-separated integers n, k (1 ≤ n, k ≤ 2000).
Output a single integer — the number of good sequences of length k modulo 1000000007 (109 + 7).
3 2
5
6 4
39
2 1
2
In the first sample the good sequences are: [1, 1], [2, 2], [3, 3], [1, 2], [1, 3].
思路:从左往右递推,枚举倍数。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
long long dp[2010][2010],mod=1000000007,ans;
int num[2010][2010],vis[2010][2010];
int main()
{ int T,t,n,m,i,j,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{ dp[1][i]=1;
}
for(i=2;i<=m;i++)
for(j=1;j<=n;j++)
for(k=j;k<=n;k+=j)
{ dp[i][k]+=dp[i-1][j];
dp[i][k]%=mod;
}
for(i=1;i<=n;i++)
ans+=dp[m][i];
ans%=mod;
printf("%I64d\n",ans);
}