1 条题解
-
0
自动搬运
来自洛谷,原作者为

youyou2007
如果你已选择生命,那便是选择了活下去。 活在这个世界,见证这个世界。体验它,并真切地接受这最后的每一个当下。搬运于
2025-08-24 22:50:18,当前版本为作者最后更新于2023-08-23 23:45:49,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这里是出题人题解。
Solution
5pts
随便手模两下即可算出 的情况,注意 无解即可得分。
15pts
可以通过各种奇奇怪怪的爆搜来通过 的数据。
40pts
给一些 的算法通过的数据,但我没有想出来怎么用这个复杂度构造。

100pts
异或均用 代替。
做本题前需要先明确几个比较简单的性质:( 是正整数)
- 性质 :如果 为偶数,那么 。
这个性质很好理解: 与 只有最低位是不同的,所以异或以后为 。
-
性质 :如果 为正整数,那么 ,。
-
性质 :由第一个性质还可以得出,如果 是偶数,那么有 ,如果 是奇数,那么有 。
明确了上述性质,我们很快会有一个想法:可以考虑将一个偶数与比该偶数多 的奇数视为一组,这样每一组的异或和为 。而每两组的异或和为 。
即,当 是偶数时,,。
发现两组是 个数,根据 的余数进行分类讨论构造:
-
时:
考虑构造序列 。因为除 与 以外,剩下的数为 个,为 组,所以除 与 以外的其他数异或和为 ,再有 ,所以构造成立。
例如 时可以构造序列为 。
-
时:
考虑构造序列 ,因为除 以外,剩下的数为 个,可以分成 组,所以异或和为 ,再有 ,所以构造成立。
例如 时可以构造序列为 。
-
时:
考虑构造序列 ,因为除 与 以外,剩下的数为 个,可以分成 组,所以异或和为 ,再有 ,所以构造成立。
例如 时可以构造序列为 。
-
时:
考虑构造序列 ,因为除 以外,剩下的数为 个,可以分成 组,所以异或和为 ,再有 ,所以构造成立。
例如 时可以构造序列为 。
-
边界 & 无解情况( 时)
在 很小时需要注意不能按照上述方式构造,否则可能存在问题。
当 时,通过手模可知没有构造方案满足要求,所以无解。
与 在样例中已经给出一组可行解,因此不再赘述。
Code
#include <bits/stdc++.h> using namespace std; int n, T; int main() { scanf("%d", &T); while(T--) { scanf("%d", &n); if(n == 1) { puts("1"); continue; } if(n == 3) { puts("-1"); continue; } if(n % 4 == 0) { for(int i = 1; i <= n; i++) { printf("%d ", i); } } else if(n % 4 == 1) { for(int i = 2; i < n - 1; i += 2) { printf("%d %d ", i, i + 1); } printf("%d %d %d ", n, n + 1, n + 2); } else if(n % 4 == 3) { for(int i = 2; i < n - 1; i += 2) { printf("%d %d ", i, i + 1); } printf("%d %d %d ", n - 1, n + 1, n + 2); } else { for(int i = 1; i <= n - 1; i++) { printf("%d ", i); } printf("%d ", n + 1); } puts(""); } return 0; }
- 1
信息
- ID
- 8138
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者