解题思路:
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分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论