平衡素数
原题链接:平衡素数
思路整理
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;
}

浙公网安备 33010602011771号