#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; } |
English