#include <cstdio>
#include <vector>
#define MAX_N 1000000
using namespace std;
int n;
int maxBitCounts[MAX_N];
vector<int> solve;
void prepareMaxBitCounts() {
maxBitCounts[0] = 0;
for (int i = 1; i < MAX_N; i++) {
maxBitCounts[i] = maxBitCounts[i - 1] + __builtin_popcount(i);
}
}
int main() {
prepareMaxBitCounts();
scanf("%d", &n);
int bitsLeft = n;
int nextNumber = MAX_N;
while(bitsLeft > 0) {
while (nextNumber > 0 && maxBitCounts[nextNumber - 1] >= bitsLeft) {
nextNumber--;
}
solve.push_back(nextNumber);
bitsLeft -= __builtin_popcount(nextNumber);
nextNumber--;
}
printf("%lu\n", solve.size());
for (size_t i = 0; i < solve.size(); i++) {
printf("%d%c", solve[i], (i == solve.size() - 1) ? '\n' : ' ');
}
}
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 | #include <cstdio> #include <vector> #define MAX_N 1000000 using namespace std; int n; int maxBitCounts[MAX_N]; vector<int> solve; void prepareMaxBitCounts() { maxBitCounts[0] = 0; for (int i = 1; i < MAX_N; i++) { maxBitCounts[i] = maxBitCounts[i - 1] + __builtin_popcount(i); } } int main() { prepareMaxBitCounts(); scanf("%d", &n); int bitsLeft = n; int nextNumber = MAX_N; while(bitsLeft > 0) { while (nextNumber > 0 && maxBitCounts[nextNumber - 1] >= bitsLeft) { nextNumber--; } solve.push_back(nextNumber); bitsLeft -= __builtin_popcount(nextNumber); nextNumber--; } printf("%lu\n", solve.size()); for (size_t i = 0; i < solve.size(); i++) { printf("%d%c", solve[i], (i == solve.size() - 1) ? '\n' : ' '); } } |
English