拉的一道比赛题。。。当时没做出来~~~~~思路不够清晰。。。
很简单的思想。。。
核心:
for(int l=1; l<k; l++)
for(int i=1; i<=n; i++)
for(int j=1; i*j<=n; j++)
map[l+1][i*j]+=map[l][i],map[l+1][i*j]%=mod;
l+1长度的串,最后的数为i*j的情况下,只需往map[l][i]的后面添加一个i的j倍的数即可;枚举i,j;后将长度为k的累加即为所求值;
代码如下:
#include<stdio.h>
#include<string.h>
#define mod 1000000007
int map[2002][2002];
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
memset(map,0,sizeof(map));
for(int i=1; i<=n; i++)
map[1][i]=1;
for(int l=1; l<k; l++)
for(int i=1; i<=n; i++)
for(int j=1; i*j<=n; j++)
map[l+1][i*j]+=map[l][i],map[l+1][i*j]%=mod;
int res=0;
for(int i=1; i<=n; i++)
res+=map[k][i],res%=mod;
printf("%d\n",res);
}
return 0;
}