2777 - 素数环
时间限制 : 1 秒
内存限制 : 128 MB
一个大小为N(N<=17)的质数环是由1到N共N个自然数组成的一个数环,数环上每两个相邻的数字之和为质数。如下图是一个大小为6的质数环。为了方便描述,规定数环上的第一个数字总是1。如下图可用1 4 3 2 5 6来描述。若两个质数环,数字排列顺序相同则视为本质相同。现在要求你求出所有本质不同的数环。
题目输入
输入1行:一个正整数N,表示质数环的大小。
题目输出
输出多行:每一行描述一个数环,如果有多组解,按照字典序从小到大输出,如果无解则不输出。
输入/输出样例
输入格式
6
输出格式
1 4 3 2 5 6 1 6 5 2 3 4
C++解答
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> using namespace std; int b[20]={0},a[20],sum=0; int i,m,n,j,k; int pd (int m) { int i; for (i=2;i<=floor(sqrt(m));++i) if (m%i==0) return 0; return 1; } int pl (int s) { int i,j; for (i=2;i<=n;++i) if ((b[i]==0)&&(pd(i+a[s-1])==1)) { a[s]=i; b[i]=1; if (s==n) { if (pd(a[20]+a[1])==1) { sum+=1;if (sum>1) cout<<endl; for (j=1;j<=n;++j) if (j==1) cout<<a[j]; else cout<<" "<<a[j]; } } else pl(s+1); b[i]=0; } } int main () { cin>>n; a[1]=1; pl(2); return 0; }
Java解答
import java.util.Scanner; public class Main { static int n; static int[] a = new int[50]; static boolean[] vis = new boolean[50]; static boolean[] isp = new boolean[50]; public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { n = in.nextInt(); a[0] = 1; for (int i = 2; i <= n * 2; i++) isp[i] = isPrime(i); dfs(1); } } public static void dfs(int cur) { if (cur == n && isp[a[n - 1] + a[0]]) { for (int i = 0; i < n; i++) { if (i == n - 1) System.out.println(a[i]); else System.out.print(a[i] + " "); } } else { for (int i = 2; i <= n; i++) { if (!vis[i] && isp[i + a[cur - 1]]) { a[cur] = i; vis[i] = true; dfs(cur + 1); vis[i] = false; } } } } public static boolean isPrime(int n) { if (n < 2) return false; for (int j = 2; j * j <= n; j++) if (n % j == 0) return false; return true; } }