1358 - 素数环

2024-06-12 15:12
文章标签 素数 1358

本文主要是介绍1358 - 素数环,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

从 1 \sim n1∼n 这 nn 个数,摆成一个环,要求相邻的两个数的和是素数,按照由小到大请输出所有可能的摆放形式。

比如:n = 4n=4,输出形式如下;

1:1 2 3 4
2:1 4 3 2
3:2 1 4 3
4:2 3 4 1
5:3 2 1 4
6:3 4 1 2
7:4 1 2 3
8:4 3 2 1
total:8

比如:n = 6n=6,输出形式如下;

1:1 4 3 2 5 6
2:1 6 5 2 3 4
3:2 3 4 1 6 5
4:2 5 6 1 4 3
5:3 2 5 6 1 4
6:3 4 1 6 5 2
7:4 1 6 5 2 3
8:4 3 2 5 6 1
9:5 2 3 4 1 6
10:5 6 1 4 3 2
11:6 1 4 3 2 5
12:6 5 2 3 4 1
total:12

输入

一个整数 nn ;(2 \le n \le 102≤n≤10)

输出

前若干行,每行输出一个素数环的解,最后一行,输出解的总数。

样例

输入

4

输出

1:1 2 3 4
2:1 4 3 2
3:2 1 4 3
4:2 3 4 1
5:3 2 1 4
6:3 4 1 2
7:4 1 2 3
8:4 3 2 1
total:8

来源

回溯

#include<bits/stdc++.h>
using namespace std;
const int inf=11;
int n,use[inf],f=0;
bool vis[inf];
void print(){printf("%d:",++f);for(int i=1;i<=n;i++){printf("%d ",use[i]); }printf("\n");
}
bool prime(int n){if(n<=1){return false;}for(int i=2;i*i<=n;i++){if(n%i==0){return false;}}return true;
}
void dfs(int k){if(k==n){bool flag=false;for(int i=1;i<n;i++){if(!prime(use[i]+use[i+1])){flag=true;}}if(!flag&&prime(use[1]+use[n])){print();}}for(int i=1;i<=n;i++){if(!vis[i]){vis[i]=true;use[k+1]=i;dfs(k+1);vis[i]=false;}}
}
int main(){cin>>n;dfs(0);printf("total:%d",f);return 0;
}

这篇关于1358 - 素数环的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054570

相关文章

js算法判断是否为素数

/*判断一个数字是否是质数: 质数(prime number)又称素数,有无限个。除了1和它本身以外不再被其他的除数整除。*/ function isPrime(number){ //判断输入是否为number类型,是否为整数       if (typeof number!=='number'||!Number.isInteger(number))      {

【时时三省】c语言例题----华为机试题< 查找组成一个偶数最接近的两个素数>

山不在高,有仙则名。水不在深,有龙则灵。                                                                         ----CSDN 时时三省 1,题目 HJ60 查找组成一个偶数最接近的两个素数 描述 任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个

题目:求100以内的素数,全部打印出来。

题目:求100以内的素数,全部打印出来。 public class ZhaoSuShu {public static void isPrime1(){int i,j,count = 0;//System.out.println("2");for(i = 1; i <= 100; i++){for(j = 2; j <= i; j++){if(i % j == 0){break;}}if(j ==

素数判定和分解质素数

1.素数判定   public static boolean isPrime(int n) {if (n <= 1) return false;if (n == 2) return true;if (n % 2 == 0) return false;int limit = (int)Math.sqrt(n) + 1;for (int i = 3; i <= limit; i += 2) {i

Java-计算素数

判断输入的数字是不是素数: public class SuShu{public static void main(String[] args){java.util.Scanner s=new java.util.Scanner(System.in);int i=s.nextInt();boolean isSuShu=true; //标记;for(int j=2;j<i;j++){if(i%j=

常见素数筛法

列出几种常用的素数筛选法,附上计时器。。。 #include<cstdio>#include<cstdlib>#include<cmath>#include<map>#include<queue>#include<stack>#include<vector>#include<algorithm>#include<cstring>#include<string>#inclu

【编程基础C++】素数判定、最小公倍数与最大公因数的实现方法

文章目录 素数法一法二 最大公因数辗转相除法另一写法 最小公倍数直接枚举法根据GCD算LCM 素数 素数 是指大于1的自然数,且只能被1和自身整除。例如,2、3、5和7都是素数。它们在数学中非常重要,因为任何大于1的自然数都可以唯一地表示为素数的乘积,这被称为素数分解。 法一 #include <iostream>using namespace std;bool IsPr

求素数的几个方法(最朴素版、n*sqrt(n)版、埃氏筛、欧拉筛)

最朴素版O(n^2) #include <bits/stdc++.h>using namespace std;int n, cnt, prim[6000000];bool flag; //true 表示质数int main(){scanf("%d", &n);for(int i=2; i<=n; ++i){flag=true; //默认为质数for(int j=2; j<=i-

【素数】-HDU-2521-反素数

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2521 题目描述:求区间内因数最多的数是哪个? 解题思路: 九野大神划到素数这类题里的,我看过的人是 4 / 8 就去做了一下。。晕。看起来好水,没想到真的很水。。1A 了。 AC代码: #include <iostream>#include <cstdio>#include <alg

统计素数并求和 / 求奇数和

练习4-11 统计素数并求和   (20分) 本题要求统计给定整数MM和NN区间内素数的个数并对它们求和。 输入格式: 输入在一行中给出两个正整数MM和NN(1\le M\le N\le 5001≤M≤N≤500)。 输出格式: 在一行中顺序输出MM和NN区间内素数的个数以及它们的和,数字间以空格分隔。 输入样例: 10 31 输出样例: 7 143 #inclu