这是一道
x
o
r
xor
xor 构造题
题目传送门
题意
构造一个长度 2 m + 1 2^{m+1} 2m+1 的序列 a a a 满足:
- ∀ i ∈ [ 1 , 2 m + 1 ] , a i ∈ [ 0 , 2 m − 1 ] \forall i \in[1, 2^{m+1}], a_i \in [0, 2^m-1] ∀i∈[1,2m+1],ai∈[0,2m−1] 且每个数都恰好出现两次。
- 对于任意一对 ( i , j ) (i, j) (i,j) 满足 a i = a j a_i = a_j ai=aj, a i ⊕ a i + 1 ⊕ ⋯ ⊕ a j − 1 ⊕ a j = k a_i\oplus a_{i+1} \oplus \cdots \oplus a_{j-1} \oplus a_j = k ai⊕ai+1⊕⋯⊕aj−1⊕aj=k
温心提示: ⊕ \oplus ⊕ 是按位异或运算。
思路
首先我们根据题意可以看出 k > 2 m − 1 k>2^m-1 k>2m−1 时肯定是无解的,然后我们要知道一个定理
因为 a ⊕ a = 0 a\oplus a=0 a⊕a=0 所以可得
1 ⊕ 2 ⊕ 3 ⊕ 4 ⊕ . . . . . . ⊕ 2 ⊕ 1 = 0 1\oplus2\oplus3\oplus4\oplus......\oplus2\oplus1=0 1⊕2⊕3⊕4⊕......⊕2⊕1=0
且
0
⊕
a
=
a
0\oplus a=a
0⊕a=a
所以这题我们只需要构造一个
0
,
1
,
2
,
.
.
.
.
.
2
m
−
1
,
k
,
2
m
−
1....
,
2
,
1
,
0
,
k
0,1,2,.....2^m-1,k,2^m-1....,2,1,0,k
0,1,2,.....2m−1,k,2m−1....,2,1,0,k
的序列就可以了
注意
有种特殊情况
- m = 1 , k = 0 m=1,k=0 m=1,k=0 时是有解的
代码
#include<bits/stdc++.h>
using namespace std;
long long m,k;
int main()
{
cin>>m>>k;
if(m==1)//特判
{
if(k==0)
cout<<"0 0 1 1";
else
cout<<-1;
return 0;
}
if(k>=pow(2,m)){
cout<<-1;
return 0;}
long long j=pow(2,m);
for(int i=0;i<j;i++)
{
if(i!=k)
cout<<i<<" ";
}
cout<<k<<" ";
for(int i=j-1;i>=0;i--)
{
if(i!=k)
cout<<i<<" ";
}
cout<<k;
}