1 条题解
-
0
题解
题意简述
给定一个,要求构造一个 的排列 ,使得对于每一个 都有:
如果无法构造,输出 。
思路分析
1. 模运算的条件
对于某个固定的 ,条件 等价于:
即:
$$\max(p_{i-1}, p_i) = i \cdot k + (i-1) \quad (k \ge 0) $$由于 ,并且 ,所以有两种可能:
- :
- :
但因为排列中元素 ,当 较大时 会很快不可能。我们需要整体构造。
2. 奇数 的构造
当 为奇数时,我们可以构造:
验证如下:
- 对于 :
因为 是奇数,,而 ,满足条件。
- 对于 :
而 ,同样满足。
因此该构造对奇数 有效。
3. 偶数 不可能
我们证明对于偶数 不存在这样的排列。
① 位置分析
如果 在 或 位置:- 若 ,则对于 ,(不可能,因为最大值就是 ?等等,这里逻辑有问题)
更准确地说,若 ,则 ,要求 ,但偶数 不满足。 - 若 ,则对于,,同样要求 ,不成立。
所以 不能在 或 。
若 ,则对于 :
要求 ,即 ,不可能。
所以 也不能在 。因此 必须放在 中的某个位置。
② 矛盾推导
设 是 在排列中的位置()。于是:
这两个 分别是 和 。
条件要求:
考虑两个相邻整数 和,它们中必有一个是偶数(因为相邻数一奇一偶)。记这个偶数为 。
那么有:
但 是奇数,而 是偶数,偶数模偶数结果应为偶数,不可能得到奇数。矛盾。
因此偶数 无解。
复杂度
每个测试用例 构造输出,总复杂度 。
代码实现
#include <bits/stdc++.h> using namespace std; int main() { int T, n; cin >> T; while (T--) { cin >> n; if (n & 1) { // n 为奇数 cout << n << ' '; for (int i = 1; i < n; ++i) { cout << i << " \n"[i == n - 1]; } } else { // n 为偶数 cout << "-1\n"; } } return 0; }
- 1
信息
- ID
- 7034
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者