思路:
对于一个二进制100011;
尽量将填满:填成111111;
然后有一个很好算的方法
gets(n)表示二进制下N有多少位,N^X=(111111)2
X=111111^N;
其实答案可以直接 ANS=N*(N+1);找的规律;
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll; int n;
int num(int x)
{
int k=;
while (x)
{
k++;
x/=;
}
return k;
} int b[];
int a[];
int main()
{
int n;
while (scanf("%d",&n)!=EOF)
{
memset(b,,sizeof(b));
for (int i=n;i>=;i--)
if (!b[i]){
int k=((<<num(i))-)^i;
b[i]=k;
b[k]=i;
} printf("%I64d\n",(ll)(n+)*n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
for (int i=;i<n;i++) printf("%d ",b[a[i]]);
printf("%d\n",b[a[n]]);
}
return ;
}