// {{{ by shik
#include <bits/stdc++.h>
#include <unistd.h>
#define SZ(x) ((int)(x).size())
#define ALL(x) begin(x),end(x)
#define REP(i,n) for ( int i=0; i<int(n); i++ )
#define REP1(i,a,b) for ( int i=(a); i<=int(b); i++ )
#define FOR(it,c) for ( auto it=(c).begin(); it!=(c).end(); it++ )
#define MP make_pair
#define PB push_back
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef vector<int> VI;

#ifdef SHIK
template<typename T>
void _dump( const char* s, T&& head ) { cerr<<s<<"="<<head<<endl; }

template<typename T, typename... Args>
void _dump( const char* s, T&& head, Args&&... tail ) {
    int c=0;
    while ( *s!=',' || c!=0 ) {
        if ( *s=='(' || *s=='[' || *s=='{' ) c++;
        if ( *s==')' || *s==']' || *s=='}' ) c--;
        cerr<<*s++;
    }
    cerr<<"="<<head<<", ";
    _dump(s+1,tail...);
}

#define dump(...) do { \
    fprintf(stderr, "%s:%d - ", __PRETTY_FUNCTION__, __LINE__); \
    _dump(#__VA_ARGS__, __VA_ARGS__); \
} while (0)

template<typename Iter>
ostream& _out( ostream &s, Iter b, Iter e ) {
    s<<"[";
    for ( auto it=b; it!=e; it++ ) s<<(it==b?"":" ")<<*it;
    s<<"]";
    return s;
}

template<typename A, typename B>
ostream& operator <<( ostream &s, const pair<A,B> &p ) { return s<<"("<<p.first<<","<<p.second<<")"; }
template<typename T>
ostream& operator <<( ostream &s, const vector<T> &c ) { return _out(s,ALL(c)); }
template<typename T, size_t N>
ostream& operator <<( ostream &s, const array<T,N> &c ) { return _out(s,ALL(c)); }
template<typename T>
ostream& operator <<( ostream &s, const set<T> &c ) { return _out(s,ALL(c)); }
template<typename A, typename B>
ostream& operator <<( ostream &s, const map<A,B> &c ) { return _out(s,ALL(c)); }
#else
#define dump(...)
#endif

template<typename T>
void _R( T &x ) { cin>>x; }
void _R( int &x ) { scanf("%d",&x); }
void _R( long long &x ) { scanf("%" PRId64,&x); }
void _R( double &x ) { scanf("%lf",&x); }
void _R( char &x ) { scanf(" %c",&x); }
void _R( char *x ) { scanf("%s",x); }

void R() {}
template<typename T, typename... U>
void R( T& head, U&... tail ) {
    _R(head);
    R(tail...);
}

template<typename T>
void _W( const T &x ) { cout<<x; }
void _W( const int &x ) { printf("%d",x); }
template<typename T>
void _W( const vector<T> &x ) {
    for ( auto i=x.cbegin(); i!=x.cend(); i++ ) {
        if ( i!=x.cbegin() ) putchar(' ');
        _W(*i);
    }
}

void W() {}
template<typename T, typename... U>
void W( const T& head, const U&... tail ) {
    _W(head);
    putchar(sizeof...(tail)?' ':'\n');
    W(tail...);
}

#ifdef SHIK
#define FILEIO(...)
#else
#define FILEIO(name) do {\
    freopen(name ".in","r",stdin); \
    freopen(name ".out","w",stdout); \
} while (0)
#endif

// }}}

int naive( VI v ) {
    int n=SZ(v),ans=0;
    REP(i,1<<n) if ( i ) {
        VI u;
        REP(j,n) if ( (i>>j)&1 ) u.PB(v[j]);
        if ( SZ(u)%2!=0 ) continue;
        int m=SZ(u)/2;
        bool ok=1;
        REP(j,m) ok&=u[j]==u[j+m];
        if ( ok ) ans++;
    }
    return ans;
}

const int L=210;
const LL N=1e12+10;

LL dp[L][L];
void build( VI a, VI b ) {
    int n=SZ(a),m=SZ(b);
    REP(i,n) dp[i][m]=1;
    REP(j,m) dp[n][j]=1;
    dp[n][m]=1;
    for ( int i=n-1; i>=0; i-- ) for ( int j=m-1; j>=0; j-- ) {
        LL s=0;
        s+=dp[i+1][j];
        s+=dp[i][j+1];
        // s-=dp[i+1][j+1];
        // if ( a[i]==b[j] ) s+=dp[i+1][j+1];
        if ( a[i]!=b[j] ) s-=dp[i+1][j+1];
        dp[i][j]=s;
    }
}

LL calc( VI v ) {
    LL ans=0;
    int n=SZ(v);
    REP1(i,1,n-1) {
        VI a(v.begin(),v.begin()+i);
        VI b(v.begin()+i,v.end());
        build(a,b);
        REP(j,i) if ( a[j]==b[0] ) ans+=dp[j+1][1];
        // ans+=dp[0][0];
    }
    return ans;
}

bool cmp( const pair<LL,VI> &a, const pair<LL,VI> &b ) {
    return 1.0*a.first/SZ(a.second) > 1.0*b.first/SZ(b.second);
    if ( a.first!=b.first ) return a.first>b.first;
    return SZ(a.second)<SZ(b.second);
}

vector<pair<LL,VI>> vv;
// LL f[L];
int main() {
    vv.PB({1,{1,1}});
    while ( vv.back().first<N ) {
        auto p=vv.back();
        p.first=p.first*2+1;
        p.second.PB(1);
        vv.PB(p);
    }
    vv.PB({3,{1,2,1,2}});
    while ( vv.back().first<N ) {
        auto p=vv.back();
        p.first=p.first*3+3;
        p.second.PB(1);
        p.second.PB(2);
        vv.PB(p);
    }
    vv.PB({6,{1,2,1,2,1}});
    while ( vv.back().first<N ) {
        auto p=vv.back();
        p.first=p.first*3+3;
        p.second.PB(2);
        p.second.PB(1);
        vv.PB(p);
    }
    REP(i,30000) {
        int l=rand()%50+1;
        VI v;
        int r1=rand()%100;
        int r2=rand()%(100-r1)+1;
        REP(j,l) {
            int r=rand()%100;
            if ( r<r1 ) v.PB(1);
            else if ( r<r1+r2 ) v.PB(2);
            else v.PB(3);
        }
        vv.PB({calc(v),v});
    }
    sort(ALL(vv),cmp);
    // for ( auto v:vv ) dump(v);
    LL n;
    R(n);
    VI sol;
    int c=0;
    for ( auto v:vv ) while ( n>0 && v.first<=n ) {
        n-=v.first;
        for ( int i:v.second ) sol.PB(c+i);
        c+=*max_element(ALL(v.second));
        dump(n,v.first,SZ(sol));
    }
    W(SZ(sol));
    W(sol);
    return 0;
}


Measured memory_bytes: 6644