深搜,添加数字后如果仍为质数,继续递归。
#include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #define mkp make_pair using namespace std; const double EPS=1e-8; typedef long long lon; const lon SZ=10050,INF=0x7FFFFFFF; vector<int> pri,res; bool isp[SZ]; bool isprime(int x) { for(int i=0;i<pri.size();++i) { if(x!=pri[i]&&x%pri[i]==0)return 0; } return 1; } void dfs(int x,int n,int val) { if(x==n) { res.push_back(val); return; } val*=10; for(int i=1;i<10;i+=2) { val+=i; if(isprime(val)) { dfs(x+1,n,val); } val-=i; } } void init() { memset(isp,1,sizeof(isp)); isp[1]=0; for(int i=2;i*i<SZ;++i) { if(isp[i]) for(int j=i*i;j<SZ;j+=i) { isp[j]=0; } } for(int i=2;i<SZ;++i) { if(isp[i]) { pri.push_back(i); } } } void work(int n) { init(); for(int i=0;i<4;++i) { dfs(1,n,pri[i]); } } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(lon time=1;time<=casenum;++time) { int n; cin>>n; work(n); for(int i=0;i<res.size();++i) { cout<<res[i]<<endl; } } return 0; }