题目:Problem - 414B - Codeforces
题目大意:从1~n中选择k个数,使得相邻两个数间可以整除(即a[j+1] % a[j] = 0)。求出满足条件的集合数,结果对1e9+7取余。
题解:动态规划。dp[i][j]:i个数,最大数是j,全部的集合数。
动态转移方程:dp[i][j] = dp[i-1][j的全部因子]。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N = 2023;
int n, k, ans, dp[N][N];//dp[i][j]:第i位,最高位是j的集合数
int main(){
cin>>n>>k;
for(int i = 1; i <= n; ++i){
dp[1][i] = 1;
}
for(int i = 1; i <= k; ++i){
for(int j = 1; j <= n; ++j){
for(int p = j; p <= n; p += j){
dp[i+1][p] += dp[i][j] ;
dp[i+1][p] %= mod;
}
}
}
for(int i = 1; i <= n; ++i){
ans += dp[k][i];
ans %= mod;
}
cout<<ans<<endl;
}