平衡素数

原题链接:平衡素数

思路整理

1.题目大意

给一个整数,如果是平衡素数,输出Yes,否则输出大一点的平衡素数

2.找素数

用线性筛法

3.找更大的平衡素数

这里使用lower_bound函数,复杂度O(logn)。注意数组lower_bound返回的是int*,可以用lower_bound(a,a+n,x)-a的方式取得下标。
代码如下

点击查看代码
#include<iostream>
#include<vector>

using namespace std;

const int N=2e7+10;
int primes[N],cnt,id;
bool st[N];
int q[N];

void init(){
    for(int i=2;i<=N;i++){
        if(!st[i])  primes[cnt++]=i;
        for(int j=0;primes[j]*i<=N;j++){
            st[primes[j]*i]=true;
            if(i%primes[j]==0)  break;
        }
    }
}

int main(){
    int n,k;
    cin>>k;
    init();
    for(int i=1;i<=cnt;i++){
        if(primes[i]*2==primes[i-1]+primes[i+1]){
            q[id++]=primes[i];
        }
    }

    while(k--){
        cin>>n;
        int i=lower_bound(q,q+id,n)-q;//查找关键

        if(q[i]==n)    puts("Yes");
        else{
            printf("No %d\n",q[i]);
        }
    }

    return 0;
}
posted @ 2025-05-17 18:56  青檀炽羽  阅读(14)  评论(0)    收藏  举报