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
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// {{{
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>

#define each(...)    for (auto& __VA_ARGS__)
#define rep(i, b, e) for (int i = (b); i <= (e); i++)
#define rev(i, b, e) for (int i = (e); i >= (b); i--)
#define mp make_pair
#define mt make_tuple
#define x first
#define y second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#ifdef SPONGE
#define dbg(f, ...) fprintf(stderr, "\033[1;33m" f "\033[0m", ##__VA_ARGS__)
#else
#define dbg(...) 1
#endif
#define tC template<class

using namespace std;

tC T> using V = vector<T>;
tC T1, class T2> using P = pair<T1,T2>;
tC T, class C=greater<T>> using PQ = priority_queue<T,V<T>,C>;

using ll = long long;
using ld = long double;
using ul = unsigned long long;
using pii = P<int,int>;
using pll = P<ll,ll>;
using pld = P<ld,ld>;
using vi = V<int>;
using vll = V<ll>;
using vld = V<ld>;
using vb = V<bool>;
using vs = V<string>;
using vpii = V<pii>;
using vpll = V<pll>;
using vpld = V<pld>;

tC T> int sz(const T& a) { return (int)a.size(); }
tC T> bool amin(T& a, T b) { return b < a ? a = b, 1 : 0; }
tC T> bool amax(T& a, T b) { return b > a ? a = b, 1 : 0; }

const size_t rseed = 4488;
// chrono::high_resolution_clock::now().time_since_epoch().count();
mt19937 rnd(rseed);
tC T> T rand(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); }

const int oo = 1e9 + 1;
const ll OO = 1e18 + 1;

namespace { void solve(); }
// }}}

int main()
{
  int t = 1;
  // scanf("%d", &t);
  rep(i, 1, t) {
    // printf("Case #%d: ", i);
    solve();
  }
}

namespace {

const int N = 1e6;
const int M = 2e5;
int n, nast[M + 1][20], bity[M + 1], dp[N + 50];

void solve()
{
  scanf("%d", &n);

  rep(i, 0, M) {
    int x = i, ile = 0;
    rep(k, 0, 18) {
      nast[i][k] = oo;
    }
    rep(k, 0, 18) {
      if (x & (1 << k)) ile++;
    }
    bity[i] = ile;
    rep(k, 0, 18) {
      if ((x & (1 << k)) == 0) {
        int y = x ^ (1 << k);
        rep(j, 0, k) {
          amin(nast[i][ile + 1 + j], y ^ ((1 << j) - 1));
        }
      }
      else {
        x ^= (1 << k);
        ile--;
      }
    }
  }

  dp[0] = 0;
  rep(i, 1, n) dp[i] = oo;
  rep(i, 0, n) rep(j, 1, 18) amin(dp[i + j], nast[dp[i]][j]);

  /*
  rep(i, 0, 5) {
    rep(j, 1, 5) printf("%d ", nast[i][j]);
    printf("\n");
  }
  */

  /*
  rep(i, 0, n) {
    dbg("%d -> %d\n", i, dp[i]);
  }
  */

  vi odp;
  while (n > 0) {
    odp.pb(dp[n]);
    n -= bity[dp[n]];
  }

  printf("%d\n", sz(odp));
  each(x : odp) printf("%d ", x);
}

}