首页 > 试题广场 >

完美异或

[编程题]完美异或
  • 热度指数:550 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定一个长度为 n 的数组 \{a_1,a_2,\dots,a_n\},如果满足以下两条性质,则称其为伟大数组
{\hspace{20pt}}_\texttt{1.}\,数组单调非降,且所有元素都是非负整数;
{\hspace{20pt}}_\texttt{2.}\,其异或和 \displaystyle \bigoplus_{i=1}^{n} a_in 的一个因子,即 n \bmod \left(\bigoplus_{i=1}^{n} a_i\right)=0

\hspace{15pt}现在给定整数 n,请你构造一个长度为 n伟大数组,或者判断不存在这样的数组。

\hspace{15pt}【名词解释】
\hspace{23pt}\bullet\,按位异或\mathrm{xor} 表示按位异或运算,运算方法为对两个整数的对应二进制位进行比较:若两位相同则结果为 0,不同则结果为 1
\hspace{23pt}\bullet\,异或和\displaystyle\bigoplus_{i=1}^{n} a_i 表示将所有 a_i 依次按位异或得到的结果。

输入描述:
\hspace{15pt}每个测试文件均包含多组测试数据。第一行输入一个整数 T\left(1\leqq T\leqq 10^4\right) 代表数据组数,每组测试数据描述如下: 
\hspace{15pt}在一行上输入一个整数 n\left(1\leqq n\leqq 2\times 10^{5}\right) —— 需要构造的数组长度。
\hspace{15pt}除此之外,保证单个测试文件的 n 之和不超过 2\times 10^{5}


输出描述:
\hspace{15pt}对于每一组测试数据: 
\hspace{23pt}\bullet\,如果存在伟大数组,请在一行上按照非递减顺序输出 n 个整数 a_1,a_2,\dots,a_n\left(0\leqq a_i\leqq 10^{18}\right)
\hspace{23pt}\bullet\,如果不存在伟大数组,直接输出一个整数 \texttt{-1}
\hspace{15pt}如果存在多种可行答案,你可以输出任意一种即可,系统会自动判定是否正确。
示例1

输入

3
1
2
3

输出

1
1 3
2 2 3

说明

\hspace{15pt}在这一组样例中: 
\hspace{23pt}\bullet\,n=1 时,数组 \{1\} 的异或和为 1,显然 1\mid 1
\hspace{23pt}\bullet\,n=2 时,数组 \{1,3\} 的异或和为 1\oplus 3 = 2,并且 2\mid 2
\hspace{23pt}\bullet\,n=3 时,数组 \{2,2,3\} 的异或和为 2\oplus 2\oplus 3 = 3,并且 3\mid 3

备注:

额...排行最高的那几个直接输出-1的做法是怎么回事(
发表于 2025-12-03 16:51:58 回复(0)