题目链接:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5719
flag: 完全背包问题
** F[i][j]定义为:序列以i结尾的长度为j的数目;
F[i][j]=∑F[x][j-1](所有使x| i成立的x);表示第i结尾的长度为j的序列即由所有的以i的因子结尾的长度j-1的序列后面加一个i;
**我们只需要:预先求出1~2000的各个的全部因子,即达到减枝的作用;
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stack>
#include <string.h>
#define Size 2000
#define Mod 1000000007
#define llt long long
using namespace std;
llt F[Size+10][Size+10]={0};
vector <int> V[Size+10];
void Bag(){
for(int i=1;i<=Size;++i){
for(int j=1;j<=i;++j){
if(i%j==0)V[i].push_back(j);
}
F[i][1]=1;
}
for(int l=2;l<=Size;++l){
for(int i=1;i<=Size;++i){
for(int j=0;j<V[i].size();++j){
F[i][l]=(F[i][l]+F[V[i][j]][l-1])%Mod;
}
}
}
}
int main(){
Bag();
int T;scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
llt ans=0;
for(int i=1;i<=n;++i)
ans=(ans+F[i][m])%Mod;
printf("%lld\n",ans);
}
return 0;
}