[题解]CF1741B Funny Permutation
思路
简单构造题,我们可以分为三种情况进行构造。
-
时,一定无解,输出
-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;
}
作者:WaterSun
出处:https://www.cnblogs.com/WaterSun/p/18264806
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】