求助,有没有不开o2过最后一个测试点的方法

P1217 [USACO1.5] 回文质数 Prime Palindromes

iamaretardiamaretard @ 2023-08-08 16:22:28

#include <iostream>
#include <stdlib.h>
#include <bitset>
#include <iomanip>
#include <cmath>
#include <algorithm>
#include <numeric>
#include <vector>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e8 + 10;
bitset <maxn> pri;
int chosen[maxn];
int pp = 0;

//欧拉
inline void eular(int a) {
    for (int i = 2; i <= a ; i += 1) {
        if (!pri[i])
            chosen[++pp] = i;
        for (int j = 1;  j <= pp &&  chosen[j] *i <= a; j++) {
            pri[i * chosen[j]] = 1;
            if (!i % chosen[j]  )
                break;
        }
    }

}

//判断回文数
inline bool access(int e) {
    int temp = e, ans = 0;
    while (temp) {
        ans += (temp % 10);
        temp /= 10;
        if (temp > 0)
            ans *= 10;
    }
    return (ans == e ? 1 : 0);
}

int main() {
    int b, a, p;
    scanf ("%d %d", &b, &a);
    eular(a);
    for (int i = 1; i <= pp; i++) {
        if (b <= chosen[i]) {
            p = i;
            break;
        }
    }
    for (int i = p; i <= pp; i++) {
        if (access(chosen[i]))
            printf("%d\n", chosen[i]);
    }

}

by iamaretardiamaretard @ 2023-08-08 16:23:07

感觉还能优化


by Argvchs @ 2023-08-08 16:24:51

@iamaretardiamaretard 打表


by yzm0325 @ 2023-08-08 16:35:22

@iamaretardiamaretard

#include <iostream>
using namespace std;

int a, b, num;
bool prime(int);

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> a >> b;

    if(a <= 5 && b >= 5) cout << 5 << "\n";
    if(a <= 7 && b >= 7) cout << 7 << "\n";
    if(a <= 11 && b >= 11) cout << 11 << "\n";

    for(int d1 = 1; d1 <= 9; d1 += 2)
        for(int d2 = 0; d2 <= 9; d2++) {
            int num = 100 * d1 + 10 * d2 + d1;
            if(num < a) continue;
            if(num > b) return 0;
            if(prime(num)) cout << num << "\n";
        }

    for(int d1 = 1; d1 <= 9; d1 += 2)
        for(int d2 = 0; d2 <= 9; d2++)
            for(int d3 = 0; d3 <= 9; d3++) {
                int num = 10000 * d1 + 1000 * d2 + 100 * d3 + 10 * d2 + d1;
                if(num < a) continue;
                if(num > b) return 0;
                if(prime(num)) cout << num << "\n";
            }

    for(int d1 = 1; d1 <= 9; d1 += 2)
        for(int d2 = 0; d2 <= 9; d2++)
            for(int d3 = 0; d3 <= 9; d3++)
                for(int d4 = 0; d4 <= 9; d4++) {
                    int num = 1000000 * d1 + 100000 * d2 + 10000 * d3 + 1000 * d4 + 100 * d3 + 10 * d2 + d1;
                    if(num < a) continue;
                    if(num > b) return 0;
                    if(prime(num)) cout << num << "\n";
                }

    return 0;
}

bool prime(int x) {
    if(x == 1) return 0;
    for(int i = 2; i * i <= x; i++)
        if(x % i == 0) return 0;
    return 1;
}

深基的方法


by iamaretardiamaretard @ 2023-08-09 10:05:26

@zym0325 谢谢


|