题意:素数环
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int MAXN = 40;
int n;
int res[MAXN];
int isprim[MAXN],vis[MAXN];
void prim(){
memset(isprim,1,sizeof(isprim));
int m = sqrt(MAXN+0.5);
for (int i = 2; i <= m; i++)
if (isprim[i]){
for (int j = i*i; j <= MAXN; j+=i)
isprim[j] = 0;
}
}
void dfs(int cur,int deep){
if (cur == deep && isprim[res[0]+res[deep-1]]){
for (int i = 0; i < deep-1; i++)
printf("%d ",res[i]);
printf("%d\n",res[deep-1]);
}
for (int i = 2; i <= n; i++){
if (!vis[i] && isprim[i+res[cur-1]]){
vis[i] = 1;
res[cur] = i;
dfs(cur+1,deep);
vis[i] = 0;
}
}
}
int main(){
int t = 1;
prim();
while (scanf("%d",&n) != EOF){
memset(vis,0,sizeof(vis));
printf("Case %d:\n",t++);
if (n&1 && n != 1)
continue;
res[0] = 1;
dfs(1,n);
printf("\n");
}
return 0;
}