1.回文质数的数量很少
2.除了11以外的回文质数都是偶数。
3.1-1亿内的回文数不到30000个。
4.1-10000的质数约1000个。
这样深搜找出所有的回文数,再判断是否质数。
#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> vct,pri,res; bool isp[SZ]; void dfs(int x,int dgt) { if(dgt==7) { return; } for(int i=0;i<10;++i) { int nx; if(dgt==-1)nx=i; else nx=i*pow(10,dgt+1)+x*10+i; if(!(dgt==5&&i==0)) { if(i)vct.push_back(nx); dfs(nx,dgt+2); } } } 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 x,int y) { vct.push_back(0); vct.push_back(11); dfs(0,-1); init(); for(int i=0;i<vct.size();++i) { //if(vct[i]<10000)cout<<vct[i]<<endl; if(vct[i]>=x&&vct[i]<=y) { bool ok=1; //cout<<"h"<<endl; for(int j=0;j<pri.size();++j) { if(vct[i]==pri[j])continue; //cout<<pri[j]<<endl; if(vct[i]%pri[j]==0) { ok=0; break; } } if(ok) { res.push_back(vct[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 a,b; cin>>a>>b; work(a,b); sort(res.begin(),res.end()); for(int i=0;i<res.size();++i) { cout<<res[i]<<endl; } } return 0; }