【题解】序列

题目描述

  一个长度为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

【题解】序列的相关文章

题解:序列 (Standard IO)

题解 序列 (Standard IO) Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits Description Fiugou想要在一个长度为N的序列A中找到不同位置的三个数,以这三个数为三边长来构成一个三角形.但是它希望在满足条件下,这三个数的位置尽量靠前.具体地,设这三个数的为Ai,Aj,Ak(i<j<k), Fiugou希望k尽量小:当k相等时,满足j尽量小:当k,j均相等时,满足i尽量小.但是这个序列中的数可

POJ 3982 序列 大数题解

又是一道大数相加的题目,直接模板或者Java都可以水过了. 循环相加33次就可以了,计算出A99是第几个,准确输出答案. #include <stdio.h> #include <string> #include <algorithm> using std::string; const int MAX_B = 5120; char buf[MAX_B]; int id = 0, len = 0; inline char getFromBuf() { if (id >

[题解]BZOJ1004 序列函数

原题找不到了,应该是usaco之类的题目吧.给一个可以交题的链接:http://www.cqoi.net:2012/problem.php?id=1004 思路:将素数一个一个往里乘,保证扫描的顺序是从小到大的就可以了.思路跟usaco training的丑数有点像,算是那道题的简单版吧. 我的实现: 1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstri

bzoj 1858: [Scoi2010] 序列操作 题解

[原题] 1858: [Scoi2010]序列操作 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1031  Solved: 529 [Submit][Status] Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b 把[a, b]区间内的所有数全变成1 2 a b 把[a,b]区间内

BZOJ1798题解 Seq维护序列题解 双tag裸线段树

BZOJ1798题解 Seq维护序列题解 双tag裸线段树 1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5549  Solved: 1951[Submit][Status][Discuss] Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)

Codevs3657括号序列题解

题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则(S)和[S]都是合法的 (3)假如A和B都是合法的,那么AB和BA也是合法的 例如以下是一些合法的括号序列: (),[],(()),([]),()[],()[()] 以下是一些不合法括号序列的: (,[,],)(,([]),([() 现在给定一些由"(",")","[","]"构成的序列 ,请添加尽

【基础练习】【数论/模拟】codevs1670 无穷的序列题解

文章被盗还是很严重,加版权信息 转载请注明出处 [ametake版权所有]http://blog.csdn.net/ametake欢迎来看看 题目: 题目描述 Description 有一个无穷序列如下: 110100100010000100000- 请你找出这个无穷序列中指定位置上的数字 输入描述 Input Description 第一行一个正整数N,表示询问次数: 接下来的N行每行一个正整数Ai,Ai表示在序列中的位置. 输出描述 Output Description N行,每行为0或1,

【apio2014】【bzoj3675】序列分割 题解&代码(C++)

题解: 不考虑那么大的数据范围,首先我们可以想出它的dp解法,dp[i][k]表示前i个数字分成k段的最大分值,那么转移方程则为: dp[i][k]=max(dp[j][k-1]+sum[j]*(sum[i]-sum[j])); 然而这样做的话很明显是k×n^2的算法,对于100000的数据来说即使k只有200也是会超时的,因此我们要想办法降低一维复杂度使得算法变为n×k的复杂度,而降低动态规划复杂度一般都是通过降低状态转移的那一维即枚举j的复杂度,这就用到了斜率优化. 根据斜率优化一贯的做法,

P2023 [AHOI2009]维护序列 题解(线段树

题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这篇题解. (详情见代码注释) AC代码 #include<stdio.h> #define min(a,b) (a>b?b:a) #define max(a,b) (a>b?a:b) typedef long long ll; int n,m; ll mod,k,a[500010];

题解 P4093 【[HEOI2016/TJOI2016]序列】

这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人问号... 然后才发现原来是求的子序列是满足任意一次修改后不降... 于是列出两(san)个条件式子,就可以 CDQ 切掉了 QWQ \(j<i\) \(a_j<min_i\) \(max_j<a_i\) 这里的 max 和 min 就是某个位置上出现过的最 大/小 值 watch out