我们先将数字配对:对于\(1\)~\(n\)中的数\(i\),如果\(i⊕x≤n\),则\(i\)与\(i⊕x\)配对(显然这是来两两配对的),特别地,如果\(x≤n\),则\(x\)单独为一组
设\(B\)为\(x\)的最高位,\(M\)是\(1\)~\(n\)中第\(B\)位为\(1\)的数字的集合,不难知道这些数字与\(x\)的异或小于\(n\),而且上述配对一定要求配对中某一个数的第\(B\)位为\(1\),也就是说我们可以将所有的配对表示成(\(i⊕x,i\)),其中\(i\)是集合\(M\)的元素
对于任意一种合法的方案,任何一个集合中一定有至少一个数字的第\(B\)位为\(1\),所以一定要求\(k\)不超过\(|M|\);我们按上述配对方法配对,并将每个配对作为一个集合,如果\(1\) ~ \(n\)中剩下的没有配对的数字的异或和为\(0\),那么我们肯定可以找到一种方案,如下:显然\(k\)必须要为奇数并且\(1\)~\(n\)的异或和为\(x\)才可能有解,此时由于\(1\) ~ \(n\)中剩下的没有配对的数字的异或和为\(0\),那么配对数一定为奇数并且可以将剩下的没有配对的数字随意放到一个配对集合里面;由于三个配对集合可以合并成一个集合,而每次合并会让集合数目减少\(2\),故此时可以一直合并知道集合数量为\(k\)
如果\(1\)~\(n\)中剩下的没有配对的数字的异或和不为\(0\),我们来证明无解
假设我们已经找到了一组合法的解,考虑某一对在这组解中的位置,不妨认为这组解是\((i,i⊕x)\):
若这组解中,\(i\)与\(i⊕x\)在同一个集合中,那么这个集合中剩下的数的异或和为\(0\),我们将剩下的数拿出来作为一个新的集合(但是注意这个集合的异或和不是\(x\)而是\(0\))
若这组解中,\(i\)与\(i⊕x\)不在同一个集合中,那么我们考虑他们各自在的两个集合中除了他们剩下的数;假如两者所在的集合分别为\(S_1,S_2\),剩下的数的异或和分别为\(A,B\),不难知道\(A=i⊕x,B=i\),于是我们将\(S_1,S_2\)变成两个新的集合{\(i,i⊕x\)},{\(A,B\)},显然没问题
由以上过程可以知道,任何一种合法的解都可以变换为若干个集合,其中每个集合都形如{\(i,i⊕x\)}或{\(x\)}或若干个{\(0\)}(最后一个集合是上面描述中第一种方法产生的集合),我们将若干个{\(0\)}合并成一个{\(0\)},这最后一个{\(0\)}就是\(1\)~\(n\)中剩下的没有配对的数字的异或和,故必须为\(0\)
当然上述做法只是对题解的一个严格证明,要做的话还是这么想:从构造题的角度我们尽量构造简单的集合,不要被题目所给的一个集合中有大于两个元素给迷惑了;从\(k\)的角度,由于题目要求刚好有\(k\)个,这比较难实现,所以我们考虑可能的最大集合数量并且利用异或和合并的性质进行缩小就好了