#include <bits/stdc++.h> using namespace std; vector<int> sumOfOnesInAllLesser; vector<int> numOfOnes; void init(const int sumOfBits) { sumOfOnesInAllLesser.push_back(0); numOfOnes.push_back(0); for (int i = 1; sumOfBits > sumOfOnesInAllLesser.back(); ++i) { numOfOnes.push_back((i & 1) + numOfOnes[i / 2]); sumOfOnesInAllLesser.push_back(sumOfOnesInAllLesser.back() + numOfOnes.back()); } } int main() { std::ios::sync_with_stdio(false); int n; cin >> n; init(n); vector<int> ret; for (int i = numOfOnes.size() - 1;;) { ret.push_back(i); n -= numOfOnes[i]; if (n == 0) break; while (i > 0 && sumOfOnesInAllLesser[i - 1] >= n) i--; } cout << ret.size() << endl; for (const auto &a : ret) cout << a << ' '; cout << endl; return 0; }
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 38 39 40 41 42 | #include <bits/stdc++.h> using namespace std; vector<int> sumOfOnesInAllLesser; vector<int> numOfOnes; void init(const int sumOfBits) { sumOfOnesInAllLesser.push_back(0); numOfOnes.push_back(0); for (int i = 1; sumOfBits > sumOfOnesInAllLesser.back(); ++i) { numOfOnes.push_back((i & 1) + numOfOnes[i / 2]); sumOfOnesInAllLesser.push_back(sumOfOnesInAllLesser.back() + numOfOnes.back()); } } int main() { std::ios::sync_with_stdio(false); int n; cin >> n; init(n); vector<int> ret; for (int i = numOfOnes.size() - 1;;) { ret.push_back(i); n -= numOfOnes[i]; if (n == 0) break; while (i > 0 && sumOfOnesInAllLesser[i - 1] >= n) i--; } cout << ret.size() << endl; for (const auto &a : ret) cout << a << ' '; cout << endl; return 0; } |