【题解】幸运数列

题目描述

幸运数列是指该数列的每一个数都至少是它前面的数的两倍。假设数列的元素个数是N,元素的值范围是从1到M,当N=4,M=10时,可以生成下面4个幸运数列:

1 2 4 8

1 2 4 9

1 2 4 10

1 2 5 10

给定N和M,你的任务是算出有多少个幸运数列可供选择。

输入输出格式

输入格式

一行,按照N和M的顺序排列且满足1≤N≤10, 1≤M≤1000,N和M被一个空格分隔。

输出格式

一行,只需输出数对N和M所产生的幸运数列的个数。

输入输出样例

输入样例

4 10

输出样例

4

 

题解

直接推即可,前缀和优化可以更快。

#include <iostream>

#define MAX_N (10 + 5)
#define MAX_M (1000 + 5)

using namespace std;

int n, m;
int a[MAX_N][MAX_M];

int main()
{
    cin >> n >> m;
    if((1 << n - 1) > m) return cout << 0, 0;
    int r = m >> n - 1;
    for(register int i = 1; i <= m; ++i)
    {
        a[1][i] = i;
    }
    for(register int i = 2; i <= n; ++i)
    {
        r <<= 1;
        for(register int j = 1 << i - 1; j <= m; ++j)
        {
            a[i][j] = a[i - 1][j >> 1] + a[i][j - 1];
        }
    }
    cout << a[n][m];
    return 0;
}

参考程序

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

时间: 2024-08-30 07:09:04

【题解】幸运数列的相关文章

【线段树】【树状数组】【CF 121E】幸运数列

1922. [CF 121E]幸运数列 ★★★ 输入文件:cf121e.in 输出文件:cf121e.out 简单对比 时间限制:3 s 内存限制:256 MB [题目描述] 对于欧洲人来说,"幸运数"是指那些十进制只由4或7组成的数.财务员Petya需要维护一个支持如下操作的整数数列: add l r d - 表示将[l, r]区间内的所有数加上一个正整数d(). count l r - 统计[l, r]区间内有多少个"幸运数".() 请你帮助Petya实现它.

CodeForces E. Lucky Array 幸运数列

CodeForces    E. Lucky Array  幸运数列 Petya loves lucky numbers. Everybody knows that lucky numbers are positive integers whose decimal representation contains only the lucky digits 4 and 7. For example, numbers 47, 744, 4 are lucky and 5, 17, 467 are n

题解——loj6280 数列分块入门4 (分块)

分块维护一个区间和 然后记得更新的时候左边角块的tag不要打错到右边角块 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; long long sz,num,n,belong[50100],a[50100],sum[50100],tag[50100]; void calbe(int n){ for(int i=1;i&

蓝桥杯练习系统题解

转于:http://www.cnblogs.com/cshhr/p/3550014.html 蓝桥杯官网练习系统题解(非VIP) BEGIN-4(Fibonacci数列) 有递推公式,大家都知道用递推公式求,仅仅要记得在递推的时候同一时候取模求好 这里给一份另类代码,用矩阵高速幂求,事实上还有循环节 /* (1 1) * (Fn-1) = ( Fn )//矩阵相乘,将就着看吧 (1 0) (Fn-2) (Fn-1) (1 1) * (1 1) * (Fn-2) = ( Fn ) (1 0) (1

1428:数列分段

1428:数列分段 题解 注意数列分段的题目不可以打乱顺序 原数列是[ 4  2  4  5  1 ] 划分为三段吼是 [ 4  2 ][ 4 ][ 5  1 ] 我们先从第一个开始,当前状态标记为 s ,一开始,s=a[1] 那么接下来从2开始枚举到n 如果当前状态加上一个数字仍然不超过最大限度m 的话,那就把这个数字加入当前状态,也就是不再开一个段数,否则就要新开一段了,同时重置状态s=a[ i ] 最后ans要自加,因为一开始的第一个没有算进去 代码 #include<iostream>

【题解】序列终结者

题目链接 \(splay\)维护区间加,区间翻转,区间\(max\). 维护标记,区间加标记和区间翻转标记.记住两个是同级的,都要更新. 更详细的解释请参考笔者的题解:数列. #include<cstdio> #include<iostream> #include<cstring> using namespace std; const int MAXN=5e5+10; const int inf=2e9; int n,m,id,rt,vx[MAXN]; struct S

矩阵十题【三】 HDU 1588 Gauss Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588 题目大意:先要知道一组斐波那契数列 i 0 1 2 3 4 5 6 7 f(i) 0 1 1 2 3 5 8 13 下面给你一组数: k,b,n,M 现在知道一组公式g(i)=k*i+b:(i=0,1,2,3...n-1) 让你求出 f(g(i)) 的总和(i=01,2,3,...,n-1),比如给出的数据是2 1 4 100 2*0+1=1   f(1)=1 2*1+1=3   f(3)=2

「CSPS 2019 十一」 贪心

一般来说,如果题目需要求一个最优解或者最小(大)花费之类的,而且除了暴力之外想不到什么好方法,那么就可能需要用贪心. 通常地,我们猜想一些步骤能不能直接使用贪心,然后再去证明这个贪心是对的. 有时候可能要多想几种贪心才能找到正确的那一种. New Year Snowmen Description 要堆起一个雪人,需要三个不同大小的雪球.现在有 \(n\) 个给定大小的雪球,问最多能堆起多少个雪人,并输出方案. Solution 每次用数量最多的三个雪球是最优的.可以用一个单调队列,每次取出最大的

数列 题解(NOIP模拟T2)

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. [题目描述] a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1]  (x>3) 求a数列的第n项对1000000007(10^9+7)取余的值. [输入格式] 第一行一个整数T,表示询问个数. 以下T行,每行一个正整数n. [输出格式] 每行输出一个非负整数表示答案. [样例输入] 3 6 8 10 [样例输出] 4 9 19 [数据范围] 对于30%的数据 n<=100: 对于60%的数据 n<=