这个是地址 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4011
题意:给出n和k,用1到n的数选出k个数组成一个序列,要求是每一个后面的数能整除前面的数。
分析:其后面一个数是多少直接由他前面的数来决定:
f[i][j]表示长度为i的序列,最后一项为j的方案数,调和级数枚举j的倍数k转移给f[i+1][k]
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int mod=1e9+7; 5 const int maxn=2010; 6 int dp[maxn][maxn]; 7 int main(){ 8 ios::sync_with_stdio(false); 9 int i,j,z,t; 10 cin>>t; 11 while(t--){ 12 int n,k,ans=0; 13 cin>>n>>k; 14 memset(dp,0,sizeof(dp)); 15 for(i=1;i<=n;i++) dp[1][i]=1; 16 for(i=1;i<k;i++) 17 for(j=1;j<=n;j++) 18 for(z=j;z<=n;z+=j) dp[i+1][z]=(dp[i+1][z]+dp[i][j])%mod; 19 for(i=1;i<=n;i++) ans=(ans+dp[k][i])%mod; 20 cout<<ans<<endl; 21 } 22 return 0; 23 }