动态规划
dp[i][j]表示前i位以j结尾的符合相应性质的数列的个数。dp[i][j]=dp[i][j]+dp[i-1][x], 其中1<=i<=n, 1<=j<=k, 1<=x<=k且(x<=j或者x>j&&x%j!=0)。然后把所有的dp[n][j],1 <= j <= k加起来即为所求。
#include <iostream>
using namespace std;
int main(void)
{
int n, k;
cin >> n >> k;
int** dp = new int* [n + 1]; //创建二维数组dp[][],dp[i][j]表示前i位以j结尾的符合相应性质的数列的个数
for (int i = 0; i <= n; i++)
{
dp[i] = new int[k + 1];
}
for (int i = 0; i <= n; i++) //对dp[][]的所有元素初始化为0
{
for (int j = 0; j <= k; j++)
dp[i][j] = 0;
}
for (int j = 1; j <= k; j++) //dp[1][j]的所有元素设为1
dp[1][j] = 1;
for (int i = 1; i < n; i++) //dp[i + 1][x] += dp[i][j],x >= j或j % x != 0
{
for (int j = 1; j <= k; j++)
{
for (int x = 1; x <= k; x++)
{
if (x >= j || j % x != 0)
dp[i + 1][x] += dp[i][j];
}
}
}
int sum = 0;
for (int j = 1; j <= k; j++) //把所有的dp[n][j],1 <= j <= k加起来即为所求
sum += dp[n][j];
cout << sum % 1000000007<< endl;
return 0;
}
运行结果: