当前位置: 首页 > article >正文

素数环(信息学奥赛一本通-2110)

【题目描述】

输入正整数n,把整数1,2,…,n 组成一个环,使得相邻两个整数之和均为素数。

【输入】

输入正整数n。

【输出】

输出任意一个满足条件的环。

【输入样例】

6

【输出样例】

4 3 2 5 6 1

【提示】

数据满足:

4≤n≤30

【题解代码】

#include<bits/stdc++.h>
using namespace std;

int n;
bool vis[35];  //标记数组
int cnt[35];  //存储每一层的数据
bool flag = false;  //作为是否已经找到的标记,用于剪枝
//
// 判断是否是素数
// 
// 朴素法:(数据量较小时可以使用该种方法)
//bool isprime(int x)
//{
//	if (x < 2) return false;
//	for (int i = 2; i <= sqrt(x); i++)
//	{
//		if (x % i == 0) return false;
//	}
//	return true;
//}

//埃氏筛法:将素数的倍数全部筛掉,留下的就是素数
bool isprime[100];  //标记数组   0-是素数   1-不是素数
void E_sieve(int x)
{
	isprime[0] = isprime[1] = 1;  //0和1都不是素数
	for (int i = 2; i * i <= x; i++)
	{
		if (isprime[i] == 0)  //i是素数
		{
			for (int j = i * i; j <= x; j += i)  //n之内的i的所有倍数都不是素数
			{
				isprime[j] = 1;
			}
		}
	}
}

void dfs(int depth)
{
	if (depth > n)
	{
		if (isprime[cnt[1] + cnt[depth - 1]]) return;  //如果首尾之和不是素数
		for (int i = 1; i < depth; i++)
		{
			printf("%d ", cnt[i]);
		}
		flag = true;
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if ((depth==1 && !vis[i]) || (depth > 1 && !vis[i])&& !isprime[i+cnt[depth-1]])  
		{
			cnt[depth] = i;
			vis[i] = 1;
			dfs(depth + 1);
			vis[i] = 0;
			if (flag) return;  //如果已经找到了,直接逐层返回即可,不需要继续寻找
		}
	}
}

int main()
{
	cin >> n;
	E_sieve(2 * n);
	dfs(1);
	return 0;
}

http://www.kler.cn/a/548029.html

相关文章:

  • 力扣 395. 至少有 K 个重复字符的最长子串 递归
  • Java短信验证功能简单使用
  • 深度优化:如何用结构化提示词提升DeepSeek的响应质量
  • Ubuntu 上安装 Java 1.8
  • Unity3D 移动端 CPU 性能调优详解
  • SpringBoot3.3.0集成Knife4j4.5.0实战
  • nginx反向代理tomcat
  • linux概念详解
  • 前端构建工具
  • 聊聊 IP 地址和端口号的区别
  • 1219:马走日
  • 深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现
  • 上海正控ZK880 变频器基本操作
  • MongoDB 基本操作
  • 鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)
  • 宏基传奇swift edge偶尔开机BIOS重置
  • Linux网络 | 多路转接Poll
  • NO.18十六届蓝桥杯备战|循环嵌套|乘法表|斐波那契|质数|水仙花数|(C++)
  • 深度学习-114-大语言模型应用之提示词指南实例DeepSeek使用手册(三)
  • docker搭建redis-cluster