帮帮蒟蒻吧!!!

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

_cheems_ckr_ @ 2024-10-03 22:35:47

后面3个点全TLE了

#include <bits/stdc++.h>
using namespace std;
bool f(int n){
    if(n<2) return 0;
    for(int i=2;i*i<=n;i++)
    if(n%i==0) return 0;
    return 1;
}
bool nxd(int n){
    int t=0,n1=n;
    while(n1){
        t=t*10+n1%10;
        n1/=10;
    }
    return t==n;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=n;i<=m;i++){
        if(f(i)&&nxd(i)){
            cout<<i<<"\n";
        }
    }
    return 0;
}

by _cheems_ckr_ @ 2024-10-03 22:38:47

回帖必关


by Axolotlwww @ 2024-10-06 00:27:40

你这个单个数判断都 O(n) 了(1e8的范围啊

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

f() 函数可以继续用应该没问题,然后质数判断这里貌似只能上线性筛了,筛完遍历区间内素数然后f()判断是否回文,或者反过来先筛回文(其实一样,因为线性筛必须从2开始筛起)

我AC代码可以参考一下 (别抄

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e8+10;

bool isp[maxn];
int a,b,cnt=0;
int p[maxn];

void getP(){
    memset(isp,1,sizeof(isp));
    isp[0]=isp[1]=0;
    for(int i=0;i<=b;i++){
        if(isp[i]) p[++cnt-1]=i;
        for(int j=0;j<cnt&&i*p[j]<=b;j++){
            isp[i*p[j]]=0;
            if(i%p[j]==0) break;
        }
    }
}
bool isPal(string s){
    int slen=s.length();
    if(slen==1) return true;
    for(int i=1;i<=slen/2;i++){
        if(s[i-1]!=s[slen-i]){
            return false;
        }
    }
    return true;
}
void getPal(){
    for(int i=a;i<=b;i++){
        if(!isp[i]) continue;
        string s=to_string(i);
        if(isPal(s)){
            cout<<i<<endl;
        }
    }
}
int main(){
    cin>>a>>b;
    getP();
    getPal();

    return 0;
}

|