最后三个超时,按着题解照抄了就差,还是过不了

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

zuilp @ 2023-12-14 23:30:01

#include<stdio.h>
int sui(int n)
{
    int i=0;
    for(i=2;i<n;i++)
    {
        if(n%i==0)
        return 0;//no
    }
    return 1;
 } 
 int hui(int n,int s)
 {
    if(n==0)
         return s; 
    s*=10;
 s+=n%10;
 n=n/10;
 hui(n,s);
 }
 int wei(int n,int* p)
 {
    if(1000<n&&n<10000) 
 return 0;
    if(100000<n&&n<1000000)
 return 0;
            return 1;
 }
 int min(int a,int b)
 {
    if(a>b)
    return b;
    else
    return a;
 }
int main()
{
int i,a,b;
scanf("%d %d",&a,&b);
if(a%2==0)
a++;

for(i=a;i<=min(b,9999999);i+=2)
{
    if(wei(i,&i))
{
        if(hui(i,0)==i)
    {
        if(sui(i))
                printf("%d\n",i);
    }
}
}
    return 0;
}

by Mlzsan_HP @ 2023-12-16 16:30:04

我是先埃氏筛预处理再做 还挺快的

#include<bits/stdc++.h>
using namespace std;
bitset<100000001>z;
int zs[5000000],a,b,y,o,u;
int zx,zd;
int find(int l,int r,int k){  
    int m;
    while(l+1<r){
        m=(l+r)/2;
        if(zs[m]<=k)l=m;  
        else r=m;       
    }
    if(k-zs[l]<=zs[r]-k)return l;
    else return r;
} 
void write(int x){
    if(x>9)write(x/10);
    putchar(x%10+'0');
    return;
}
int read(){
    int x=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();
    return x;
}
int main(){
    a=read(),b=read();
    zs[1]=2,y=1;
    for(int i(3);i<=b;i+=2){
        if(z[i]==1)continue;
        y++,zs[y]=i,o=i<<1;
        for(int j(i+o);j<=b;j+=o)z[j]=1;
    }
    zx=find(1,y,a);zd=find(1,y,b);
    for(int i(zx);i<=zd;i++){
        o=zs[i],u=0;
        while(o>0){
            u*=10;
            u+=o%10;
            o/=10;
        }
        if(zs[i]==u)write(zs[i]),printf("\n");
    }
    return 0;
}

by Mlzsan_HP @ 2023-12-16 16:31:40

@zuilp

道路千万条 安全第一条 棕名不规范 亲人两行泪


by xrpo0 @ 2023-12-23 19:07:56

我也是写了额外2个函数,一个判断质数,一个判断是不是回文数。然后超时了。后面利用逻辑运算符短路特性,把判断回文数放在前面,任何923ms勉强过。


|