p1217 Prime Palindromes

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;
}

猜你喜欢

转载自www.cnblogs.com/gaudar/p/9821023.html