>Description
一个长度为k的整数序列,后一个数是前一个数的倍数。且每个数小于等于n。
给定N和k,请算出有多少个长度为k的这种序列,答案对1000000007取模。
>Input
输入共1行,包含2个用空格隔开的整数N和k。
>Output
输出共1行,包含一个整数,表示长度为k的“好序列”的个数对1000000007取模后的结果。
>Sample Input
3 2
>Sample Output
5
【数据说明】
对于40%的数据,1≤N≤30,1≤k≤10。
对于100%的数据,1≤N≤2000,1≤k≤2000。
解题思路
一开始看这道题的时候试图找到规律,但是在草稿纸上算了很久都没有算出来,就放弃了。
后来看了一下正解,发现超级简单,用DP就可以了:
f[i][j]表示:有i位数,第i位数为j,k为j的倍数,f[i+1][j*k]+=f[i][j]
>代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,f[2005][2005],ans;
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) f[1][i]=1; //设初值
for(int i=1;i<k;i++) //位数
for(int j=1;j<=n;j++) //第i位数为j
for(int k=1;k<=n/j;k++) //倍数
f[i+1][j*k]=(f[i+1][j*k]+f[i][j])%1000000007;
for(int i=1;i<=n;i++)
ans=(ans+f[k][i])%1000000007;
printf("%d",ans);
return 0;
}