【素数】P1217 [USACO1.5]回文质数 Prime Palindromes
生活随笔
收集整理的這篇文章主要介紹了
【素数】P1217 [USACO1.5]回文质数 Prime Palindromes
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
https://www.luogu.com.cn/problem/P1217
考點:素數、回文、二分、打表
題意:
找出5到1e8的回文素數。
解法:
直接暴力遍歷1億次必定超時,可以用打表法。。。
我的解法是列出1位到8位的所有回文數(不到2萬個),再把不是素數的去掉。符合條件的回文素數存在vector中,根據輸入范圍用二分找出上下界打印即可。
#include <bits/stdc++.h> using namespace std; using ll = long long;bool prime(ll x) {ll q = sqrt(x);for (int i = 2; i <= q; i++) if (x % i == 0) return false;return true; }int main() {vector<string> v1,v2,v3,v4,v5,v6,v7,v8;//ll a,b; cin >> a >> b;for (int i = 0; i <= 9; i++) v1.push_back(to_string(i));for (int i = 0; i <= 9; i++) v2.push_back(to_string(i)+to_string(i));for (int i = 0; i <= 9; i++) {for (auto &s : v1) {v3.push_back(to_string(i) + s + to_string(i));}}for (int i = 0; i <= 9; i++) {for (auto &s : v2) {v4.push_back(to_string(i) + s + to_string(i));}}for (int i = 0; i <= 9; i++) {for (auto &s : v3) {v5.push_back(to_string(i) + s + to_string(i));}}for (int i = 0; i <= 9; i++) {for (auto &s : v4) {v6.push_back(to_string(i) + s + to_string(i));}}for (int i = 0; i <= 9; i++) {for (auto &s : v5) {v7.push_back(to_string(i) + s + to_string(i));}}for (int i = 0; i <= 9; i++) {for (auto &s : v6) {v8.push_back(to_string(i) + s + to_string(i));}}vector<int> v;for (auto &s:v1) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));for (auto &s:v2) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));for (auto &s:v3) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));for (auto &s:v4) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));for (auto &s:v5) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));for (auto &s:v6) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));for (auto &s:v7) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));for (auto &s:v8) if (s[0]!='0' && prime(stoi(s))) v.push_back(stoi(s));int a,b; cin >> a >> b;int lb = lower_bound(v.begin(), v.end(), a) - v.begin(); // 第一個大于等于a的下標int ub = upper_bound(v.begin(), v.end(), b) - v.begin() - 1; // 第一個大于b的下標-1for (int i = lb; i <= ub; i++) cout << v[i] << endl;return 0; }看了別人的題解,發現比較流行的做法是用埃篩或歐篩把素數篩出來再判斷回文。
總結
以上是生活随笔為你收集整理的【素数】P1217 [USACO1.5]回文质数 Prime Palindromes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【递推】P1028 数的计算
- 下一篇: 最大公约数+最小公倍数