Codeforces 题解 - [Codeforces Round 867 (Div. 3)-D. Super-Permutation]
题目链接
题目描述
A permutation is a sequence \(n\) integers, where each integer from \(1\) to \(n\) appears exactly once. For example, \([1]\), \([3,5,2,1,4]\), \([1,3,2]\) are permutations, while \([2,3,2]\), \([4,3,1]\), \([0]\) are not.
Given a permutation \(a\), we construct(构造) an array \(b\), where \(b_i = (a_1 + a_2 +~\dots~+ a_i) \bmod n\).
A permutation of numbers \([a_1, a_2, \dots, a_n]\) is called a super-permutation if \([b_1 + 1, b_2 + 1, \dots, b_n + 1]\) is also a permutation of length \(n\).
Grisha became interested whether a super-permutation of length \(n\) exists. Help him solve this non-trivial(重要的) problem. Output any super-permutation of length \(n\), if it exists. Otherwise(不然), output \(-1\).
输入格式
The first line contains a single integer \(t\) (\(1 \le t \le 10^4\)) — the number of test cases. The description of the test cases follows.
Each test case consists of a single line containing one integer \(n\) (\(1 \le n \le 2 \cdot 10^5\)) — the length of the desired(希望实现的) permutation.
The sum of \(n\) over all test cases does not exceed \(2 \cdot 10^5\).
输出格式
For each test case, output in a separate line:
- \(n\) integers — a super-permutation of length \(n\), if it exists.
- \(-1\), otherwise.
If there are several suitable permutations, output any of them.
题目大意
构造一个数组A
其中\(b_{i} = (a_{1} + a_2 + \dots + a_i)\bmod n\)
使得数组B和数组A均为1~n的全排列
输入
4
1
2
3
6
输出
1
2 1
-1
6 5 2 3 4 1
解题思路
1
由\((1)-(2)\)可得,
让数字k代表数字n在a数组排列中的位置,即\(a_k=n\). 当\(k>1\)时,
即
此时一定不是全排列。则k一定为1,即
则
2
如果\(n\)为奇数,
此时也一定不会是全排列。因此n>1时只有n为偶数有可行方案
3
当n为偶数时,
对应的
代码实现
#include "bits/stdc++.h"
using namespace std;void Solution()
{int n; cin >> n;if(n == 1) { cout << 1 << '\n'; return; }if (n & 1) { cout << -1 << '\n'; return; }for(int i = 1;i <= n;++i){if(i & 1){cout << n - i + 1 << ' ';}else{cout << i - 1 << ' ';}}cout << '\n';return;
}//Monotonousint main()
{ios_base::sync_with_stdio(false);cin.tie(nullptr);int t; cin >> t;while (t--){Solution();}return 0;
}