解题思路:
0
1 1
2 2 1+1
3 2+1 1+1+1
4 4 2+2 2+1+1 1+1+1+1
5 4+1 2+2+1 2+1+1+1 1+1+1+1+1
6 4+2 4+1+1 2+2+2 2+2+1+1 2+1+1+1+1 1+1+1+1+1+1
0 : 1 0 0 0 0 0 0 0 0 0
1 : 1 0 0 0 0 0 0 0 0 0
2 : 1 1 0 0 0 0 0 0 0 0
3 : 1 1 0 0 0 0 0 0 0 0
4 : 1 2 1 0 0 0 0 0 0 0
5 : 1 2 1 0 0 0 0 0 0 0
6 : 1 3 2 0 0 0 0 0 0 0
7 : 1 3 2 0 0 0 0 0 0 0
0 : 1 0 0 0 0 0 0 0 0 0
1 : 1 0 0 0 0 0 0 0 0 0
2 : 1 2 0 0 0 0 0 0 0 0
3 : 1 2 0 0 0 0 0 0 0 0
4 : 1 3 4 0 0 0 0 0 0 0
5 : 1 3 4 0 0 0 0 0 0 0
6 : 1 4 6 0 0 0 0 0 0 0
7 : 1 4 6 0 0 0 0 0 0 0
1 1
1
2 1+1
2
1+1
4 1+2+1
4
2+2 2+1+1
1+1+1+1
6 2+3+1=6
4+2 4+1+1
2+2+2 2+2+1+1 2+1+1+1+1
1+1+1+1+1+1
8 1+4+4+1=10
8
4+4 4+2+2 4+2+1+1 4+1+1+1+1
2+2+2+2 2+2+2+1+1 2+2+1+1+1+1 2+1+1+1+1+1+1
1+1+1+1+1+1+1+1
参考代码:
#include <iostream> using namespace std; int map[1000001][21] = {0};//(1,000,000)10=(F4240)16 int main() { int T, N; int i, j, k, l; //预处理,打表 map[0][0] = 1; for (i = 1; i < 1000001; ++i) { l = 1; for (j = 0; l <= i; ++j, l *= 2) {//拆分出l=2^j map[i][j] = map[i - l][j]; } for (k = 1; k < 21; ++k) { map[i][k] += map[i][k - 1]; map[i][k] %= 1000000000; } } ////显示数组 // for (i = 0; i < 10; ++i) { // cout << i << " : "; // for (j = 0; j < 10; ++j) { // cout << map[i][j] << "\t"; // } // cout << endl; // } cin >> T; while (T--) { cin >> N; cout << map[N][20] << endl; } return 0; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复