题目描述
一个长度为k的整数序列b1,b2,...,bk(1≤b1≤b2≤...≤bk≤N)称为“好序列”当且仅当后一个数是前一个数的倍数,即bi+1是bi的倍数对任意的i(1≤i≤k-1)成立。
给定N和k,请算出有多少个长度为k的“好序列”,答案对1000000007取模。
输入格式
一行,包含2个用空格隔开的整数N和k。
输出格式
一行,包含一个整数,表示长度为k的“好序列”的个数对1000000007取模后的结果。
输入样例
3 2
输出样例
5
数据规模
对于40%的数据,1≤N≤30,1≤k≤10。
对于100%的数据,1≤N≤2000,1≤k≤2000。
题解
我们枚举因子来传递状态给倍数即可,这里可以用滚动数组优化。
#include <iostream> #include <fstream>#define MAX_N 2001 #define MAX_M 2001#define MOD 1000000007using namespace std;int n, m; int dp[MAX_N]; int ans;int main() {cin >> n >> m;for(register int i = n; i; --i){dp[i] = 1;}for(register int i = 2; i <= m; ++i){for(register int j = n >> 1; j; --j){for(register int k = j << 1; k <= n; k += j){dp[k] += dp[j];if(dp[k] >= MOD) dp[k] -= MOD;}}}for(register int i = n; i; --i){ans += dp[i];if(ans >= MOD) ans -= MOD;}cout << ans;return 0; }