题目描述
一个长度为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 1000000007 using 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; }
参考程序
原文地址:https://www.cnblogs.com/kcn999/p/10805301.html
时间: 2024-10-11 01:49:38