Little penguin Polo likes permutations. But most of all he likes permutations of integers from0 to n, inclusive.
For permutation p = p0, p1, ..., pn, Polo has defined its beauty — number .
Expression means applying the operation of bitwise excluding "OR" to numbersx and y. This operation exists in all modern programming languages, for example, in languageC++ and Java it is represented as "^" and inPascal — as "xor".
Help him find among all permutations of integers from 0 ton the permutation with the maximum beauty.
The single line contains a positive integer n (1 ≤ n ≤ 106).
In the first line print integer m the maximum possible beauty. In the second line print any permutation of integers from0 to n with the beauty equal tom.
If there are several suitable permutations, you are allowed to print any of them.
4
20 0 2 1 4 3
/* 贪心:两个互补的数相加,这样可以避免丢失 如:101和10为互补的两个数 */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=1000005; int ans[N],f[30]; int getlen(int n)//得到十进制数n化为二进制数后的长度 { int len=0; while(n) { len++; n/=2; } return len; } int main() { int n,i,j; f[0]=1; for(i=1;i<30;i++) f[i]=f[i-1]*2; while(~scanf("%d",&n)) { memset(ans,-1,sizeof(int)*(n+1)); for(i=n;i>=0;i--) { if(ans[i]!=-1) continue; j=f[getlen(i)]-1-i;//j与i互补 ans[i]=j; ans[j]=i; } printf("%I64d\n",(__int64)(n+1)*n); for(i=0;i<n;i++) printf("%d ",ans[i]); printf("%d\n",ans[n]); } return 0; }