简单DFS
#include"iostream"
#include"stdlib.h"
#include"string.h"
using namespace std;
typedef long long ll;
int n;
int a[50];
int res[50];
int visit[50];
bool Miller_Rabbin(ll x)
{
for(int i=2;i*i<=x;i++)
if(x%i==0) return false;
return true;
}
void dfs(int dep)
{
if(dep==n)
{
if(Miller_Rabbin(res[dep]+res[1])&&Miller_Rabbin(res[dep]+res[dep-1])) //N与1,N与N-1的和都为质数
{
for(int i=1;i<=n-1;i++) cout<<res[i]<<" ";cout<<res[n]<<endl;
}
return;
}
for(int i=1;i<=n;i++)
{
if(!visit[i]&&Miller_Rabbin(i+res[dep])) //从第二个数开始判断和前一个数相加是否为素数
{
visit[i]=1;
res[dep+1]=i;
dfs(dep+1);
visit[i]=0;
}
}
}
int main()
{
int first=1;
int Case=1;
while(cin>>n)
{
if(first) first=0;
else cout<<endl;
cout<<"Case "<<Case++<<":"<<endl;
memset(visit,0,sizeof(visit));
/*
for(int i=1;i<=n;i++)
if(!visit[i])
{
visit[i]=1;
res[1]=i;
dfs(1);
visit[i]=0;
}
*/
visit[1]=1;
res[1]=1;
dfs(1); //第一个数之前没有数字了,不用判定。
visit[1]=0;
}
return 0;
}