Problem:
Score : 1000 points

Problem Statement

We will call a string x good if it satisfies the following condition:

Condition: x can be represented as a concatenation of two copies of another string y of length at least 1.

For example, aa and bubobubo are good; an empty string, a, abcabcabc and abba are not good.

Eagle and Owl created a puzzle on good strings.
Find one string s that satisfies the following conditions. It can be proved that such a string always exists under the constraints in this problem.

1 ≤ |s| ≤ 200

Each character of s is one of the 100 characters represented by the integers 1 through 100.

Among the 2^{|s|} subsequences of s, exactly N are good strings.

Constraints

1 ≤ N ≤ 10^{12}

Input

Input is given from Standard Input in the following format:

N

Output

In the first line, print |s|, the length of s.
In the second line, print the elements in s in order, with spaces in between. Any string that satisfies the above conditions will be accepted.

Sample Input 1

7

Sample Output 1

4
1 1 1 1

There are two good strings that appear as subsequences of s: (1,1) and (1,1,1,1). There are six occurrences of (1,1) and one occurrence of (1,1,1,1), for a total of seven.

Sample Input 2

299

Sample Output 2

23
32 11 11 73 45 8 11 83 83 8 45 32 32 10 100 73 32 83 45 73 32 11 10

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>

using namespace std;

#define rep(i,a,b) for(int i=int(a),nn=int(b);i<=nn;++i)
#define vep(i,a,b) for(int i=int(a),nn=int(b);i>=nn;--i)
#define xep(i,b) for(int i=0,nn=int(b);i<nn;++i)
#define pb push_back 
#define sz(x) (int)(x.size()) 

typedef long long ll; 
const int N=1010; 

ll C[N][N]; vector<ll> v; 
int main() { 
	C[0][0]=1; v.pb(0); 
	rep(i,1,64) { C[i][0]=1; ll tc=0; 
		rep(j,1,i) C[i][j]=C[i-1][j-1]+C[i-1][j]; 
		for (int j=2; j<=i; j+=2) tc+=C[i][j]; 
		v.pb(tc); 
	} 
//	rep(i,1,10) { rep(j,0,i) cout<<C[i][j]<<' '; cout<<endl;}
//	xep(i,64) cout<<i<<": "<<v[i]<<endl; 
	ll n; cin>>n; int l=0, a[210], no=1; 
	while (n) { 
		int x=upper_bound(v.begin(),v.end(),n)-v.begin()-1; 
		xep(i,x) a[++l]=no; n-=v[x], ++no; 
	}
	cout<<l<<endl;
	rep(i,1,l) cout<<a[i]<<(i!=l?' ':'\n'); 
	return 0; 
}