题目描述
幸运数列是指该数列的每一个数都至少是它前面的数的两倍。假设数列的元素个数是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-11-07 02:29:16