首页 > 试题广场 >

小红的排列构造①

[编程题]小红的排列构造①
  • 热度指数:3749 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}小红希望你构造一个长度为 n 的排列 \{a_1,a_2,\dots,a_n\},使得对所有 1 \leqq i \leqq n,都有 a_i+i 不是质数。
\hspace{15pt}长度为 n排列是由 1 \sim nn 个正整数按任意顺序组成的数组,其中每个整数恰好出现一次。

\hspace{15pt}【名词解释】
\hspace{23pt}\bullet\,质数:大于 1 的正整数,如果它除了 1 和自身外不再有其他正整数因子,则称为质数
\hspace{23pt}\bullet\,排列:长度为 n 的排列是由 1 \sim nn 个整数按任意顺序组成的数组,其中每个整数恰好出现一次。

输入描述:
\hspace{15pt}在一行上输入一个整数 n\left(1 \leqq n \leqq 10^5\right),表示需要构造的排列长度。


输出描述:
\hspace{15pt}如果不存在满足条件的排列,在一行上输出 \texttt{-1};否则,在一行上输出 n 个整数 a_1,a_2,\dots,a_n 表示一个符合要求的排列。当存在多种可行方案时,输出任意一种均可。
示例1

输入

1

输出

-1

说明

长度为1的排列只有[1],由于1+1=2是质数,不合法。所以不存在可以构造的排列。
示例2

输入

10

输出

9 4 6 2 1 8 3 10 7 5

说明

\hspace{15pt}对于输出的排列: 
\hspace{23pt}\bullet\,a_1+1=9+1=10
\hspace{23pt}\bullet\,a_2+2=4+2=6
\hspace{23pt}\bullet\,a_3+3=6+3=9
\hspace{23pt}\bullet\,\dots
\hspace{15pt}全部 a_i+i 均不是质数,满足题意。
头像 kkkyd
发表于 2024-11-19 21:29:20
#include <iostream> using namespace std; //1和2是不可能的,3以上的数列前3位可以是3,2,1 //后面的4~n顺序排即可,后面的数与下标相等,ai+i=2*i,必然不是质数 int main() { int n; cin> 展开全文
头像 Mag1c0nch
发表于 2024-11-20 21:33:23
简化题意:构造一个n的排列满足 i+a[i] 不是素数众所周知偶数都不是素数,可以考虑从这方面下手假设排列为正序排列,那么每一项都是 2*i ,都是偶数,显然只有 1 不合法因为 2*1 是素数,所以我们可以考虑对后续影响最小的改动方法考虑将 1 和 3 互换,发现合法,手玩一下可以发现 n 为 1 展开全文
头像 BraveCoder
发表于 2025-10-16 17:56:55
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = 展开全文
头像 我是芭芭拉的狗
发表于 2026-01-01 23:45:00
n = int(input()) if n == 1 or n == 2: print('-1') else: print('3 2 1',end=' ') for i in range(4,n+1): print(i,end=' ')
头像 Kato_Shoko
发表于 2024-11-19 20:31:02
特判1 2 3这些数据就行,因为后面的数据不需要改变,第i个就是i,i+i=2i,肯定不是质数。 #include <iostream> #include <queue> #include <map> #include <set> #include & 展开全文
头像 宿伞之神
发表于 2024-11-20 00:10:28
发现n>=3一定有解,前三个构造 3 2 1 即可。 #include<bits/stdc++.h> #define int long long #define double long double #define x first #define y second using na 展开全文
头像 DJ_Chan
发表于 2025-09-11 21:38:04
import sys def main(): n = int(sys.stdin.readline()) if n <= 2: print(-1) # 2, 1 或 1, 2 都会出现质数 return # 将奇偶 展开全文
头像 湮雨
发表于 2025-08-29 15:15:03
#include <iostream> #include<vector> using namespace std; 核心思想就是,奇偶数交叉再将最后第一位奇偶数放到最后就行 int main() { int n; cin>>n; if(n& 展开全文
头像 是基德吖
发表于 2024-11-21 19:26:46
import java.io.*; import java.util.*; import java.math.BigInteger; public class Main { static void solve() { int n = in.nextInt(); 展开全文
头像 许愿___offer
发表于 2024-12-06 16:41:56
#include <iostream> #include <map> using namespace std; int main() { int n; while (cin >> n) { // 注意 while 处理多个 case 展开全文