[题解]CF1741B Funny Permutation

思路

简单构造题,我们可以分为三种情况进行构造。

  1. n=3 时,一定无解,输出 -1。(你可以试试)

  2. nmod2=1n3 时,我们直接先输出 n,n1,然后顺序输出即可。

证明:令 a 为最后构造出的序列。那么,a1=n,a2=n1,ai=i2(3in)

首先判断 a1,a2,因为我们已经特判过 3 了,因此 1n2n1

再来看后面的,因为 ai=i+2,所以 ai 一定不等于 i

又因为,a1=a2+1ai=ai+11(3in)

因此,上述构造方法成立。

  1. nmod2=0 时,直接逆序输出即可。

证明:令 a 为最后构造出的序列,那么 ai=ni+1

因为 n 为偶数。

所以:

  • i 为偶数时,ai 为奇数。

  • i 为奇数时,ai 为偶数。

又因为,一奇一偶一定互不相同且 ai=ai1+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 国际」许可协议进行许可。

posted @   WBIKPS  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示