题解幸运数列

Posted kcn999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解幸运数列相关的知识,希望对你有一定的参考价值。

题目描述

        幸运数列是指该数列的每一个数都至少是它前面的数的两倍。假设数列的元素个数是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;
}
参考程序

 

以上是关于题解幸运数列的主要内容,如果未能解决你的问题,请参考以下文章

CSDN - CSDN27题解

什么是幸运数???

CodeForces E. Lucky Array 幸运数列

PTA乙级 (1049 数列的片段和 (20分))

1049. 数列的片段和(20)

1049 数列的片段和 (20 分)