codeforces 414B
题意:
给
定
n
和
k
,
要
求
从
1
n
中
选
出
k
个
数
构
成
序
列
,
序
列
中
后
一
个
元
素
都
能
被
前
一
个
元
素
整
除
。
给定n和k,要求从1~n中选出k个数构成序列,序列中后一个元素都能被前一个元素整除。
给定n和k,要求从1 n中选出k个数构成序列,序列中后一个元素都能被前一个元素整除。
问
方
案
数
。
问方案数。
问方案数。
题解:
d p [ i ] [ k ] 表 示 长 度 为 i 的 序 列 以 数 字 k 结 尾 的 方 案 数 。 dp[i][k]表示长度为i的序列以数字k结尾的方案数。 dp[i][k]表示长度为i的序列以数字k结尾的方案数。
- d p [ i ] [ k ] = ( d p [ i ] [ k ] + d p [ i − 1 ] [ j ] ) dp[i][k] = (dp[i][k]+dp[i-1][j])%mod dp[i][k]=(dp[i][k]+dp[i−1][j])
#include <bits\stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N =2001;
int dp[N][N];
int main() {
int n, k;
cin >> n >> k;
dp[0][1] = 1;
for(int i = 1 ; i <= k ; i++){
for(int j = 1 ; j <= n ; j++){
for(int k = j ; k <= n ; k += j){
dp[i][k] = (dp[i][k]+dp[i-1][j])%mod;
}
}
}
int ans = 0;
for(int i = 1 ; i <= n ; i++){
ans = (ans+dp[k][i])%mod;
}
cout << ans << endl;
return 0;
}