/*
关键:贪心 + 找规律
0 1 2 3 4 5 6
肯定先从大的开始去找(贪心):
6:110 ---> 1:001 ==> 6^1 = 7
结果发现:
5: 101 ---> 2:010 ==> 5^2 = 7
4:100 ---> 3: 011 ==> 4^3 = 7
若 x ---> y,则区间 [x, y] 的所有值均可找到与其相匹配的数字。。。
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
typedef __int64 int64;
const int MAX_N = 100005;
int ini[MAX_N], N, ans[MAX_N];
int64 sum;
void Ini() {
ini[0] = 1;
for (int i = 1; i < MAX_N; ++i) {
int myCount = 0;
int tmp = i;
while (tmp) {
++myCount;
tmp >>= 1;
}
ini[i] = ((1 << myCount) - 1);
}
}
void Dfs(int n) {
if (n <= 0) return;
int tmp = (ini[n] ^ n);
for (int i = n; i >= tmp; --i) {
ans[i] = n + tmp - i;
}
Dfs(tmp - 1);
}
int main() {
//freopen("input.txt", "r", stdin);
Ini();
while (~scanf("%d", &N)) {
for (int i = 0; i <= N; ++i) ans[i] = 0; // 一定要初始化,否则 WA
sum = 0;
Dfs(N);
int tmp;
for (int i = N; i >= 0; --i) {
sum += (int64)(ans[i] ^ i);
}
printf("%I64d\n", sum);
for (int i = 0; i <= N; ++i) {
scanf("%d", &tmp);
printf("%d", ans[tmp]);
if (i != N) {
printf(" ");
}
}
printf("\n");
}
return 0;
}