CodeForces 288C
2016-07-21 19:57
134 查看
Description
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.
Input
The single line contains a positive integer n (1 ≤ n ≤ 106).
Output
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.
Sample Input
Input
4
Output
20
0 2 1 4 3
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.
Input
The single line contains a positive integer n (1 ≤ n ≤ 106).
Output
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.
Sample Input
Input
4
Output
20
0 2 1 4 3
#include<iostream> #include<cstring> #include<cstdio> typedef __int64 ll; using namespace std; ll result[1000010]; ll n; int main() { while(scanf("%I64d",&n)!=EOF) { ll k=1; while(k<=n) k*=2; k--; memset(result,-1,sizeof(result)); for(int i=n; i>=0; i--) { if(result[i]!=-1) continue; else { while((k^i)>n||result[k^i]!=-1) k/=2; result[k^i]=i; result[i]=k^i; } } ll sum=0; for(int j=0; j<=n; j++) sum+=j^result[j]; printf("%I64d\n",sum); for(int q=0; q<n; q++) printf("%I64d ",result[q]); printf("%I64d\n",result ); } return 0; }
相关文章推荐
- HDU 5618 (CDQ分治 树状数组)
- nginx使用logrotate对日志进行分割
- Cocos2d-x 3.x 布景层Layer
- UVA-11044 Searching for Nessy
- 求余运算
- 如何选择使用IEnumerable, ICollection, IList
- iOS/Android JSON封包与解包
- 16.对子集padding 对父级没有影响
- eclipse汉化
- vijos 1104
- 三维建模中shape of silhouette 的简要理解
- 嵌入式开发第11天 (linux-c 环境搭建,命令)
- tomcat配置文件server.xml详解
- js替换字符串中所有/全部空格
- ScrollView使用技巧之实现滑动遮盖ImageView(View)
- 【操作系统】输入输出系统(下下)-思维导图0.0
- 【ANSI转UTF-8】用iconv命令解决Mac/Linux下编码问题
- Box of bricks 堆积木
- 频谱仪使用VS示波器使用
- Hibernate灵活查询