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
#include <stdio.h>
#include <vector>

int popcount(int v) {
    int c;
    for (c = 0; v; c++) {
        v &= v - 1;
    }
    return c;
}

int main() {
    int pow;
    !scanf("%d", &pow);

    std::vector<int> sequence;

    int curr_pow = 0;
    for (int i = 0; curr_pow < pow; i++) {
        sequence.push_back(i + 1);
        curr_pow += popcount(i + 1);
    }

    int overflow = curr_pow - pow;

    for (int i = sequence.size() - 1; i > 0; i--) {
        if (popcount(sequence[i]) == overflow) {
            sequence.erase(sequence.begin() + i);
            break;
        }
    }

    printf("%lu\n", sequence.size());
    for (int i = sequence.size() - 1; i >= 0; i--) {
        printf("%d ", sequence[i]);
    }
    printf("\n");
}