社区讨论

最后三个测试点超时了,怎么办

P1217[USACO1.5] 回文质数 Prime Palindromes参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhz4914r
此快照首次捕获于
2025/11/15 01:12
4 个月前
此快照最后确认于
2025/11/16 13:47
4 个月前
查看原帖
最后三个测试点超时,有没有什么好的改进方法
CPP
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxn=1e8+1;
vector<ll>primes;
bool isprimes[maxn]={0};
vector<ll>palin;
vector<ll>palinprimes;
void solve(){
    ll a,b;
    cin>>a>>b;
    for(int i=1;i<=8;i++){
        switch(i){
            case 1:
                for(ll i=1;i<=9;i++){
                    ll k=i;
                    if(k>=a&&k<=b)  palin.push_back(k);
                }
                break;
            case 2:
                for(ll i=1;i<=9;i++){
                    ll k=10*i+i;
                    if(k>=a&&k<=b)  palin.push_back(k);    
                }
                break;
            case 3:
                for(ll i=0;i<=9;i++)
                for(ll j=1;j<=9;j++){
                    ll k=100*j+10*i+j;
                    if(k>=a&&k<=b) palin.push_back(k);
                }
                break;
            case 4:
                for(ll i=0;i<=9;i++)
                for(ll j=1;j<=9;j++){
                    ll k=1000*j+100*i+10*i+j;
                    if(k>=a&&k<=b) palin.push_back(k);
                }
                break;
            case 5:
                for(ll p=1;p<=9;p++)
                for(ll i=0;i<=9;i++)
                for(ll j=0;j<=9;j++){
                    ll k=10000*p+1000*j+100*i+10*j+p;
                    if(k>=a&&k<=b) palin.push_back(k);
                }
                break;
            case 6:
                for(ll p=1;p<=9;p++)
                for(ll i=0;i<=9;i++)
                for(ll j=0;j<=9;j++){
                    ll k=100000*p+10000*j+1000*i+100*i+10*j+p;
                    if(k>=a&&k<=b) palin.push_back(k);
                }
                break;
            case 7:
                for(ll q=1;q<=9;q++)
                for(ll p=0;p<=9;p++)
                for(ll i=0;i<=9;i++)
                for(ll j=0;j<=9;j++){
                    ll k=1000000*q+100000*p+10000*j+1000*i+100*j+10*p+q;
                    if(k>=a&&k<=b) palin.push_back(k);
                }
                break;
            case 8:
                for(ll q=1;q<=9;q++)
                for(ll p=0;p<=9;p++)
                for(ll i=0;i<=9;i++)
                for(ll j=0;j<=9;j++){
                    ll k=10000000*q+1000000*p+100000*j+10000*i+1000*i+100*j+10*p+q;
                    if(k>=a&&k<=b) palin.push_back(k);
                }
                break;
        }
    }
    for(int i=2;i<=b;i++){
        if(isprimes[i]==0){
            primes.push_back(i);
        }
        for(int j=0;j<=b&&i*primes[j]<=b;j++){
            isprimes[i*primes[j]]=1;
            if(i%primes[j]==0) break;
        }
    }
    for(int i=0;i<palin.size();i++){
        for(int j=0;j<primes.size();j++){
            if(palin[i]==primes[j]&&primes[j]>=a&&primes[j]<=b) palinprimes.push_back(primes[j]);
        }
    }
    sort(palinprimes.begin(),palinprimes.end(),[&](ll a,ll b){
        return a<b;
    });
    for(int i=0;i<palinprimes.size();i++){
        cout<<palinprimes[i]<<endl;
    }
    return ;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T=1;
    //cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...