给你一个数组
a
a
a,大小为
n
n
n,每一次可以选择一个三元组
(
i
,
j
,
k
)
(
i
≠
j
≠
k
)
(i,j,k)(i\neq j\neq k)
(i,j,k)(i=j=k),然后将
a
i
,
a
j
,
a
k
a_i,a_j,a_k
ai,aj,ak赋值为
a
i
x
o
r
a
j
x
o
r
a
k
a_i\ xor\ a_j\ xor\ a_k
aixorajxorak
有了这个总体的思路,我们不妨直接考虑一种特殊情况:如果已经有
a
i
=
a
j
a_i=a_j
ai=aj,选择
(
i
,
j
,
k
)
(i,j,k)
(i,j,k)相当于是将
a
i
,
a
j
a_i,a_j
ai,aj赋值为
a
k
a_k
ak。
因此我们可以先将若干个数变得相同,然后再将它们作为
i
,
j
i,j
i,j,变为
k
k
k。注意到一定是一对一对的,所以可以对于所有
(
2
i
+
1
,
2
i
+
2
,
2
i
+
3
)
(2i+1,2i+2,2i+3)
(2i+1,2i+2,2i+3)按顺序做,然后再做
(
2
i
+
1
,
2
i
+
2
,
n
)
(2i+1,2i+2,n)
(2i+1,2i+2,n)即可。
这样只要是奇数是一定能够分完1到
n
−
1
n-1
n−1的,如果是偶数,注意到最终状态异或和为0,而每一次操作都不会改变异或和,因此我们只需要把它当做奇数来做,有
n
−
1
n-1
n−1个相同,剩下那个也一定相同。