码迷,mamicode.com
首页 > 其他好文 > 详细

【题解】序列

时间:2019-05-03 15:57:51      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:输入格式   opened   click   ace   src   splay   包含   数组   fstream   

题目描述

  一个长度为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;
}
参考程序

 

【题解】序列

标签:输入格式   opened   click   ace   src   splay   包含   数组   fstream   

原文地址:https://www.cnblogs.com/kcn999/p/10805301.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!