把前几个的二进制写出来,然后自己画一画就能够得出结果。从大到小当前数字与该数字按位取反相连,没有能够相连的就和0相连,直接写就行了。
#include<bits/stdc++.h>
using namespace std;
#define LL long long int
#define lson rt<<1,l,m
#define rson rt<<1|1,m+1,r
int res[500500];
int s[30];
int main()
{
int n;
scanf("%d",&n);
s[0]=1;
for(int i=1;i<=30;i++)
s[i]=s[i-1]<<1;
for(int i=n-1;i>0;i--)
{
if(!res[i])
{
int x=upper_bound(s,s+30,i)-s;
x=s[x];
x=x-i-1;
if(!res[x]) res[i]=x,res[x]=i;
}
}
for(int i=0;i<n;i++)
{
if(i) printf(" ");
printf("%d",res[i]);
}
printf("\n");
return 0;
}