2024牛客寒假算法基础集训营5 H sakiko的排列构造(hard)个人补题o(╥﹏╥)o

sakiko要构造一个长度为 nnn 的排列 ppp ,使得每一个 pi+i (1≤i≤n)p_i+i\ (1\leq i\leq n)pi​+i (1≤i≤n) 都是质数。

排列的定义为:长度为 nnn 的数组,其中 1−n1-n1−n 每个数字在数组中各出现一次。

输入描述:

复制代码
第一行输入一个整数 n(1≤n≤106)n(1 \leq n \leq 10^6)n(1≤n≤106) 表示数组长度。

输出描述:

复制代码
输出 nnn 个整数表示答案,如果有多种解法,则输出任意一种。

若无解则输出 -1。

示例1

输入

复制代码
3

输出

复制代码
1 3 2

切比雪夫定理:对于一个大于1的正整数,在(a,2a]内总有一个素数

思路:在序列1.2.3...n中,对于任意一个子序列,若能使其第一个数和最后一个数相加等于一个素数,那么这一段的构造为:从最后一个数倒着把他们放入构造数组中。

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
int prime[N];
bool isprime[N];
int cnt=0;
void eular(int n)//欧拉筛法筛出所有素数
{
	memset(isprime,true,sizeof(isprime));
	isprime[1]=false;
	for(int i=2;i<=n;i++)
	{
		if(isprime[i])prime[cnt++]=i;
		for(int j=0;prime[j]*i<=n&&j<=cnt;j++)
		{
			isprime[i*prime[j]]=false;
			if(i%prime[j]==0)break;
		}
	}
}
int main()
{
	int n;
	cin>>n;
	eular(2*n);//欧拉筛
	int i=n;
	int a[n+1];
	while(i>=1)
	{
		int minp=i+1;
		while(!isprime[minp])minp++;//找到大于n的第一个素数
		int mini=minp-i;
		for(int j=mini;j<=i;j++){a[j]=minp-j;}//存入数组
		i=mini-1;//处理前面未处理的部分
	}
	for(int i=1;i<=n;i++)cout<<a[i]<<" ";//输出
}
相关推荐
明志数科7 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
KaMeidebaby7 小时前
卡梅德生物技术快报|原核表达系统工艺优化:包涵体重折叠 + 分子筛纯化实现功能 RBD 高效制备,附全参数配置
前端·人工智能·算法·数据挖掘·数据分析
无限码力7 小时前
携程0510笔试真题【单数组交换】
算法·携程笔试·携程笔试真题·携程0510笔试真题
BlockWay8 小时前
WEEX Labs 周度观察:微软-OpenAI 合作调整与AI 多云趋势
大数据·人工智能·算法·安全·microsoft
风筝在晴天搁浅8 小时前
快手 CodeTop LeetCode 224.基本计算器
数据结构·算法·leetcode
Smoothcloud润云9 小时前
5大功能精修,重构AI算力使用体验!
java·人工智能·windows·算法·重构·编辑器·sublime text
计算机安禾9 小时前
【算法分析与设计】第41篇:确定性与非确定性多项式时间:P与NP的形式化
算法
leo__52010 小时前
随机接入退避算法过程模拟实现
网络·算法
-To be number.wan10 小时前
算法日记 | STL- sort排序
c++·算法
玖釉-10 小时前
Vulkan 中 Shader 的 vert、frag、mesh、comp 全面解析:作用、关系、特点与工程实践
开发语言·c++·windows·算法·图形渲染