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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <iomanip>
#include <bitset>

const uint64_t m1  = 0x5555555555555555; //binary: 0101...
const uint64_t m2  = 0x3333333333333333; //binary: 00110011..
const uint64_t m4  = 0x0f0f0f0f0f0f0f0f; //binary:  4 zeros,  4 ones ...
const uint64_t m8  = 0x00ff00ff00ff00ff; //binary:  8 zeros,  8 ones ...
const uint64_t m16 = 0x0000ffff0000ffff; //binary: 16 zeros, 16 ones ...
const uint64_t m32 = 0x00000000ffffffff; //binary: 32 zeros, 32 ones
const uint64_t h01 = 0x0101010101010101; //the sum of 256 to the power of 0,1,2,3...

//This is a naive implementation, shown for comparison,
//and to help in understanding the better functions.
//This algorithm uses 24 arithmetic operations (shift, add, and).
uint64_t popcount64(uint64_t x)
{
    x -= (x >> 1) & m1;             //put count of each 2 bits into those 2 bits
    x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits 
    x = (x + (x >> 4)) & m4;        //put count of each 8 bits into those 8 bits 
    return (x * h01) >> 56;  //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ... 
}

int main()
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(nullptr);

    uint64_t n;
    std::cin >> n;

    uint64_t count = 1;
    uint64_t total = 0;
    while (total < n)
    {
        total += popcount64(count);
       // std::cout << std::setfill('0') << std::setw(5) << count;
        //std::cout << " " << std::bitset<8>{count}  << " " << total << std::endl;
        ++count;
    }

    --count;
    uint64_t cut = std::max(total - n, 0LU);
    std::cout << (cut > 0 ? count - 1 : count) << std::endl << count;
    for (auto i = count - 1; i > 0; --i)
    {
        if (cut > 0 && popcount64(i) == cut)
        {
            cut = 0;
            continue;
        }
        std::cout << " " << i;
    }
    std::cout << std::endl;
    //std::cout << n << " " << count << std::endl;

	return 0;
}