解题思路:
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复