题目链接:
[USACO1.5]回文质数 Prime Palindromes - 洛谷https://www.luogu.com.cn/problem/P1217
本题时间限制很严,用埃氏筛都容易tle,然后就学了线性筛, 代码如下(可作为模板)
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e8+10;
int prime[10000000]; //素数表(只是用来筛,判断该数字是不是素数要看st数组)
int cnt = 0; //当前素数个数
int a, b;
bool st[maxn]; //记录该数字是否为素数,0代表是素数,1代表不是
bool huiwen(int n){
int sum = 0, t = n;
while(t){
sum = sum*10 + t%10;
t /= 10;
}
return sum == n;
}
void init(int n){ //生成n以内的素数表
for(int i=2; i<=n; i++){
//本题时间限制很严,检查到是质数之后立刻检查是否为回文,是的话就输出
if(st[i] == 0) {prime[++cnt] = i; if(i>=a && huiwen(i)) cout << i << '\n';}
for(int j=1; prime[j]*i<=n; j++){
st[prime[j] * i] = 1; //筛出非素数
if(i%prime[j] == 0) break; //剪枝,避免重复筛
}
}
}
int main(){
cin >> a >> b;
init(b);
}