思路
简单构造题,我们可以分为三种情况进行构造。
-
\(n = 3\) 时,一定无解,输出
-1
。(你可以试试) -
\(n \bmod 2 = 1 \wedge n \neq 3\) 时,我们直接先输出 \(n,n - 1\),然后顺序输出即可。
证明:令 \(a\) 为最后构造出的序列。那么,\(a_1 = n,a_2 = n - 1,a_i = i - 2(3 \leq i \leq n)\)。
首先判断 \(a_1,a_2\),因为我们已经特判过 \(3\) 了,因此 \(1 \neq n \wedge 2 \neq n -1\)。
再来看后面的,因为 \(a_i = i + 2\),所以 \(a_i\) 一定不等于 \(i\)。
又因为,\(a_1 = a_2 + 1 \wedge a_i = a_{i + 1} - 1(3 \leq i \leq n)\)。
因此,上述构造方法成立。
- \(n \bmod 2 = 0\) 时,直接逆序输出即可。
证明:令 \(a\) 为最后构造出的序列,那么 \(a_i = n - i + 1\)。
因为 \(n\) 为偶数。
所以:
-
\(i\) 为偶数时,\(a_i\) 为奇数。
-
\(i\) 为奇数时,\(a_i\) 为偶数。
又因为,一奇一偶一定互不相同且 \(a_i = a_{i - 1} + 1\),满足题目要求。
因此,上述构造方法正确。
Code
#include <bits/stdc++.h>
#define re register
using namespace std;
int T,n;
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-') w = -1;
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + c - 48;
c = getchar();
}
return r * w;
}
int main(){
T = read();
while (T--){
n = read();
if (n == 3) puts("-1");//特判
else if (n & 1){
// n,(n-1),1,2,3,...,(n-2)
//这样无论如何也不会重复
printf("%d %d ",n,n - 1);
for (re int i = 1;i <= n - 2;i++) printf("%d ",i);
puts("");
}
else{
// n,(n-1),(n-2),...,3,2,1
//因为 n 为偶数,所以也不会有重复
for (re int i = n;i;i--) printf("%d ",i);
puts("");
}
}
return 0;
}
标签:wedge,Funny,int,题解,偶数,leq,输出,Permutation,neq
From: https://www.cnblogs.com/WaterSun/p/18264806