素数环
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=40;
int isp[MAXN];
int is_prime(int r)
{
int tmp=sqrt(r);
for(int i=2;i<=tmp;i++){
if(r%i==0){
return 0;
}
}
return 1;
}
int main()
{
int n,A[MAXN];
cin>>n;
for(int i=2;i<=2*n;i++){
isp[i]=is_prime(i);
}
for(int i=0;i<n;i++){
A[i]=i+1;
}
do{
int ok=1;
for(int i=0;i<n;i++){
if(!isp[A[i]+A[(i+1)%n]]){
ok=0;
break;
}
}
if(ok){
for(int i=0;i<n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
}while(next_permutation(A+1,A+n));
return 0;
}
int vis[MAXN];
void dfs(int cur)
{
if(cur==n&&isp[A[0]+A[n-1]]){
for(int i=0;i<n;i++){
printf("%d ",A[i]);
}
printf("\n");
}
else {
for(int i=2;i<n;i++){
if(!vis[i]&&isp[i+A[cur-1]]){
A[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
}
}