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;
}
最后说一句,那个欧拉筛的详解不是我写的,要感谢大佬。