#qm12. 算法社测验的终极考验

算法社测验的终极考验

题目背景:

这里是算法社。我们曾拥有一段熠熠生辉的岁月,但如今,这所学校的算法时代正在悄然落幕,社团也随之陷入了低谷。

但只要还有人热爱思考,算法的魅力就不会消亡,算法社就不该就此沉沦。为了打破现在的僵局,让社团重新焕发生机,我决定在新生期末考核中,放下这道终极考验作为压轴题。我想看看,在这片逐渐干涸的土壤里,是否还能绽放出惊艳的思维之花。

题目描述:

请你构造一个长度为 2n2^n 的排列 p0,p1,,p2n1p_0, p_1, \ldots, p_{2^n-1}(由 002n12^n-12n2^n 个整数各恰好出现一次),使得相邻两项异或值之和最大。换句话说,最大化:

i=12n1(pi1pi)\sum_{i=1}^{2^n-1} (p_{i-1} \oplus p_i)

可以证明,最优解一定存在。如果存在多个最优解,你可以输出任意一个。

【名词解释】

  • 长度为 mm 的排列:由 0,1,,m10,1,\ldots,m-1mm 个整数按任意顺序组成的数组,每个整数恰好出现一次。
  • \oplus:按位异或(Bitwise XOR),对两个整数的二进制表示逐位进行异或运算。

输入格式:

输入一个正整数 n (1n18)n\ (1 \le n \le 18)

输出格式:

在一行中输出 2n2^n 个整数,表示你构造的排列。整数之间用空格分隔。

输入样例:

1

输出样例:

0 1

说明/提示:

在这个样例中,输出 {0,1}\{0,1\}{1,0}\{1,0\} 都是合法的答案。