SP15891 题解

这题可以写一个质数筛,那就会有聪明的小朋友问了,什么是质数筛?

质数筛又叫埃氏筛,原理如下:

如果当前数还未被标记,则将该数所有的倍数标记。

但是埃氏筛也有一个缺陷:

如举例 $12$ 这个数,在第一次被 $2$ 筛了一遍,又被 $3$ 筛了一遍,就会导致一个数有可能会被很多数筛掉,所以就有了欧拉筛,有兴趣的可以自己去了解一下。

不过本题数据较小用埃氏筛就可以了,所以这题也就成了一道水题。

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int prime[N];//标记质数 
void p(){
    for(int i=2;i<=N;i++){//从2开始,0和1默认为0 
        if(!prime[i]){
            for(int j=i+i;j<=N;j+=i){
                prime[j]=1;//将当前数的倍数全部标记 
            }
        }
    }
} 
int main(){
    p();
    int t;
    cin>>t;
    while(t--){
        int a,b,cnt=0;
        cin>>a>>b;
        for(int i=a;i<=b;i++){
            if(prime[i]==0&&(prime[i*i+1]==0||prime[i*i+2]==0)){
                cnt++;//超级简单不过多赘述 
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

最后说一句,那个欧拉筛的详解不是我写的,要感谢大佬。

posted @ 2023-08-30 11:03  very_easy  阅读(10)  评论(0)    收藏  举报  来源