【题解】幸运数列

题目描述

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

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10661513.html
今日推荐