题目连接:Codeforces 414A Mashmokh and ACM
题目大意:给出n和k,表示要由k各数组成一个序列,序列的任意一个位置的前一个数要能被整除后一个数。然后每个数不会大于n,求有多少种满足序列。
解题思路:dp[i][j]表示第i个位置为j的情况有多少种。枚举可以被j整除的数只用枚举到sqrt(j)即可。
#include <stdio.h>
#include <string.h>
#include <math.h>
const int N = 2005;
const int MOD = 1e9+7;
int n, k, dp[N][N];
int main () {
memset(dp, 0, sizeof(dp));
dp[0][1] = 1;
scanf("%d%d", &n, &k);
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= n; j++) {
int t = sqrt(j);
for (int k = 1; k <= t; k++) {
if (j % k) continue;
dp[i][j] = (dp[i][j] + dp[i-1][k])%MOD;
if (j/k != k) {
int x = j/k;
dp[i][j] = (dp[i][j] + dp[i-1][x])%MOD;
}
}
}
}
int ans = 0;
for (int i = 1; i <= n; i++)
ans = (ans + dp[k][i]) % MOD;
printf("%d\n", ans);
return 0;
}