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
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <list>

using namespace std;

int dwojkowy(int liczba)
{
    int wyn = 0;
    while (liczba >= 2){
        int reszta = liczba % 2;
        liczba = (liczba - reszta) / 2;
        wyn += reszta;
    }
    wyn += liczba % 2;

    return wyn;
}

int main()
{
    list <int> ciag;

    int n;

    cin >> n;

    int wyn = 0;
    int suma = 0;
    int licz = 1;

    while (suma < n){
        suma += dwojkowy(licz);
        licz += 1;
    }

    licz --;

    if (suma==n){
        cout << licz << endl;
        for (int i=licz; i>=1; i--)
            cout << i << " ";
    }
    else
    {
        int x = suma - n;
        int a = licz-1;
        ciag.push_back(licz);
        int wyn = 1;
        while (x>0){
            if (dwojkowy(a) <= x)
                x -= dwojkowy(a);
            else
            {
                ciag.push_back(a);
                wyn += 1;
            }
            a -= 1;
        }
        while (a >= 1){
            ciag.push_back(a);
            a -= 1;
            wyn += 1;
        }
        cout << wyn << endl;
        for(list<int>::iterator i=ciag.begin(); i!= ciag.end(); ++i)
            cout<<*i<<" ";
    }

    return 0;
}