#include <cstdio> #include <algorithm> #include <vector> using namespace std; int n, a, index, c; int tab[2][1048576]; vector<int> ans; int main(){ tab[0][0] = 0; for(int i = 1; i <= 524288; i *= 2){ for(int j = 0; j < i; j++){ tab[0][i + j] = tab[0][j] + 1; } } tab[1][0] = 0; for(int i = 1; i <= 1000000; i++){ tab[1][i] = tab[1][i - 1] + tab[0][i]; } scanf("%d", &n); index = lower_bound(tab[1], tab[1] + 1000000, n) - tab[1]; a = tab[1][index] - n; c = index; for(int i = index; i > 0; i--){ if(tab[0][i] <= a){ a -= tab[0][i]; c--; } else ans.push_back(i); } printf("%d\n", c); for(auto i : ans){ printf("%d ", i); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include <cstdio> #include <algorithm> #include <vector> using namespace std; int n, a, index, c; int tab[2][1048576]; vector<int> ans; int main(){ tab[0][0] = 0; for(int i = 1; i <= 524288; i *= 2){ for(int j = 0; j < i; j++){ tab[0][i + j] = tab[0][j] + 1; } } tab[1][0] = 0; for(int i = 1; i <= 1000000; i++){ tab[1][i] = tab[1][i - 1] + tab[0][i]; } scanf("%d", &n); index = lower_bound(tab[1], tab[1] + 1000000, n) - tab[1]; a = tab[1][index] - n; c = index; for(int i = index; i > 0; i--){ if(tab[0][i] <= a){ a -= tab[0][i]; c--; } else ans.push_back(i); } printf("%d\n", c); for(auto i : ans){ printf("%d ", i); } } |