Little penguin Polo likes permutations. But most of all he likes permutations of integers from 0 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 numbers x and y. This operation exists in all modern programming languages, for example, in language C++ and Java it is represented as "^" and in Pascal — as "xor".
Help him find among all permutations of integers from 0 to n 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 from 0 to n with the beauty equal to m.
If there are several suitable permutations, you are allowed to print any of them.
4
20 0 2 1 4 3
![](https://i-blog.csdnimg.cn/blog_migrate/6e811dcf85fe073d578e3b2087e6733c.png)
思路:贪心,2进制位数多的创造的价值最大,优先满足这些数字,10是1010,满足这个的最大的是0101也就是5,然后推下去就是9对应6,8对应7
然后4对应3,而2对应1,0给个0,就行了,注意数据大的时候会超INT。
#include<bits/stdc++.h>
using namespace std;
int vis[1024000];
int main()
{
int n;
scanf("%d",&n);
for(int i = n;i >= 1;i--)
{
if(vis[i])continue;
int lv = log2(i)+1;
int num = (1 << lv)-1;
int tmp = num ^ i;
vis[tmp] = i;
vis[i] = tmp;
}
long long sum = 0;
for(int i = 0;i <= n;i++)
{
sum+=i^vis[i];
}
printf("%lld\n",sum);
for(int i = 0;i <= n;i++)
printf("%d ",vis[i]);
return 0;
}