//首先让a[i] = i,如果把a[1]和a[2]调换,发现到奇数位置时就会是它本身,于是n为奇数的情况直接出来了
//而如果n为偶数,例如10,我们直接让111放在最后或,只要保证前面几个数全都有最高位的1,那么最后的答案肯定是最大的。
//但是n为偶数出现了特殊情况,例如8,此时如果还把111放在最后,我们没法保证前面最高位的1不会被吞掉,但是根据第一条性质,由于2的i次方前一个数就已经是除最高位外全都为1的了,而最后一个操作又是或,所以构造方式跟第一种情况一样
#include<bits/stdc++.h>
using namespace std;
long long t;
const long long N = 2e5 + 10;
long long n;
void solve() {
cin >> n;
long long res = 0;
vector<long long> a(n + 1);
a[1] = 2,a[2] = 1;
if(n & 1) {
cout << n << '\n';
cout << a[1] << ' ' << a[2] << ' ';
for(long long i = 3;i <= n;i++) cout << i << ' ';
cout << '\n';
}
else {
long long ans = (1ll << (64 - __builtin_clzll(n))) - 1;
cout << ans << '\n';
if(n == (n & (-n))) {
cout << a[1] << ' ' << a[2] << ' ';
for(long long i = 3;i <= n;i++) cout << i << ' ';
cout << '\n';
}
else {
long long tmp = (1ll << (63 - __builtin_clzll(n))) - 1;
a[n] = tmp;
long long r = n;
for(long long i = n;i > tmp;i--) a[--r] = i;
for(long long i = 3;i < tmp;i++) a[i] = i;
for(long long i = 1;i <= n;i++) cout << a[i] << ' ';
cout << '\n';
}
}
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> t;
while(t--) solve();
return 0;
}