数很小直接手写一个素数表然后就直接用dfs就可以过了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int t[12]={2,3,5,7,11,13,17,19,23,29,31,37};
int a[20];
bool kt[41],at[21];
int n;
void dfs(int count){
if(count == n){
for(int i = 0 ; i < n-1 ; i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
return ;
}
if(count < n){
for(int i = 2 ; i <= n ; i++){
if(!at[i] || !kt[i+a[count-1]]) continue;
if( count == n-1 && !kt[i+1] ) continue;
a[count]=i;
at[i]=false;
dfs(count+1);
at[i]=true;
}
}
return ;
}
int main(){
ios::sync_with_stdio(false);cin.tie(0);
memset(kt,false,sizeof(kt));
for(int i = 0 ; i < 12 ; i++)
kt[t[i]]=true;
int c = 1;
while(cin>>n){
memset(at,true,sizeof(at));
at[1]=false;
memset(a,0,sizeof(a));
a[0]=1;
cout<<"Case "<<c++<<":"<<endl;
dfs(1);
cout<<endl;
}
return 0;
}