链接:点击打开链接
题意:从1~N中选K个数,b1,b2,b3,...bk,使得bi|bi+1(1<=i<=k-1),求出所有的方法数对1000000007取余
代码:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const long long MOD=1000000007;
long long dp[2005][2005];
int main() {
long long n,k,i,j,p,ans;
while(scanf("%I64d%I64d",&n,&k)!=EOF){
memset(dp,0,sizeof(dp));
for(i=0;i<=n;i++) //dp[i][j]的定义是末尾是i,长度是j
dp[i][1]=1;
for(i=1;i<=k;i++)
for(j=1;j<=n;j++){
for(p=j;p<=n;p+=j) //每次加j,否则会超时
dp[p][i+1]=(dp[p][i+1]+dp[j][i])%MOD;
}
ans=0;
for(i=1;i<=n;i++){
ans=(ans+dp[i][k])%MOD;
}
printf("%I64d\n",ans);
}
return 0;
}