数学+dfs
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
const int N = 40;
using namespace std;
bool is_primer[N];
int cnt = 0;
bool used[N];
int primer[N];
int ans[N];
int n;
void dfs(int u)
{
if(u == n + 1)
{
for(int i = 1;i < u;i ++)
if(i == n)cout << ans[i] << endl;
else cout << ans[i] << ' ';
return;
}
if(u == n)
{
for(int i = 2;i <= n;i ++)
if(is_primer[ans[u-1] + i] && used[i] && is_primer[i+ans[1]])
{
ans[u] = i;
used[i] = false;
dfs(u + 1);
used[i] = true;
}
}
else{
for(int i = 2;i <= n;i ++)
if(is_primer[ans[u-1] + i] && used[i])
{
ans[u] = i;
used[i] = false;
dfs(u + 1);
used[i] = true;
}
}
}
int main()
{
memset(is_primer,false,sizeof is_primer);
for(int i = 2;i < 40; i++)
{
bool f = true;
for(int j = 0;j < cnt;j ++)
if(i % primer[j] == 0)
f = false;
if(f)
{
primer[cnt ++] = i;
is_primer[i] = true;
}
}
//for(int i = 1;i < 40;i ++)
// cout << is_primer[i] << endl;
int i = 1;
while(cin >> n){
memset(used,true,sizeof(used));
used[1] = false;
ans[1] = 1;
printf("Case %d:\n",i++);
dfs(2);
printf("\n");
}
return 0;
}