P1217 [USACO1.5]回文质数 Prime Palindromes(素数筛法/打表)
一:埃氏筛(时间复杂度——nloglogn)
重点:一个数x是合数,则它的倍数也是合数
//用埃氏筛生成质数表
const int N=1e8;
bool prime[N];
void a_prime(int b){
memset(prime,1,sizeof(prime));//初始化默认全为质数
prime[0]=prime[1]=0;//0和1不是质数
int k=sqrt(b);
for(int i=2;i<=k;i++){
if(prime[i]){
for(int j=2;j<=b/i;j++)//i*j<b
prime[i*j]=0;//质数的倍数绝对不是质数
}
}
}
//最后数组prime中,值为1的数组下标是质数
二、欧拉筛/线性筛(时间复杂度——n)——最小质因子
在埃氏筛的基础上进行优化,避免一个合数重复标记(如:6被2和3同时都筛了一遍)
//筛法求素数的同时也得到了每个数的最小质因子
const int N=1e8;
bool prime[N],vis[N];
void o_prime(int b){
memset(vis,1,sizeof(vis));//初始化默认全为质数
vis[0]=vis[1]=0;//0和1不是质数
int cnt=0;
for(int i=2;i<=b;i++){
if(vis[i])//i为质数
prime[++cnt]=i;
for(int j=1;j<=cnt && i*prime[j]<b;j++){
vis[i*prime[j]]=0;//质数的倍数都不为质数
if(i%prime[j]==0)//最小质因子
break;
}
}
}
P1217 [USACO1.5]回文质数 Prime Palindromes
题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入 #1复制
5 500
输出 #1复制
5
7
11
101
131
151
181
191
313
353
373
383
AC——打表
打表大法好,下次一定记得用!!!(小心最后一个点RE)
#include <bits/stdc++.h>
using namespace std;
int arr[800]={
0,2,3,5,7,11,101,131,151,181,
191,313,353,373,383,727,757,787,797,
919,929,10301,10501,10601,11311,11411,12421,12721,
12821,13331,13831,13931,14341,14741,15451,15551,16061,
16361,16561,16661,17471,17971,18181,18481,19391,19891,
19991,30103,30203,30403,30703,30803,31013,31513,32323,
32423,33533,34543,34843,35053,35153,35353,35753,36263,
36563,37273,37573,38083,38183,38783,39293,70207,70507,
70607,71317,71917,72227,72727,73037,73237,73637,74047,
74747,75557,76367,76667,77377,77477,77977