解题思路:
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语言代码)浏览:712 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:551 |
模拟计算器 (C语言代码)浏览:966 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:687 |
printf基础练习2 (C语言代码)浏览:826 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:1215 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:616 |
C语言程序设计教程(第三版)课后习题8.4 (C语言代码)浏览:541 |
1025题解浏览:796 |
C语言程序设计教程(第三版)课后习题11.5 (C语言代码)浏览:1496 |