欧拉筛
四种素数的选择方法:
欧拉筛
埃氏筛
常规筛
朴素筛
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e6+9;
bitset<N> vis;
void euler(ll n)
{
vector<ll> primes;
vis[0]=vis[1]=true;
for(ll i=2;i<=n;i++)
{
if(!vis[i])primes.push_back(i);//如果这个数没有被筛掉则加入到质数当中去
for(ll j=0;j<primes.size()&&i*primes[j]<=n;j++)//相乘的结果不会越界
{ //对于一个i,都会和全部的已知质数相乘进行删选
vis[i*primes[j]]=true;
if(i%primes[j]==0)break;//防止重复计数
//pj*pj*k防止重复计算
//对于这个题也是可以的,防止重复计算
}
}
}
ll prefix[N];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
ll n,q;cin>>n>>q;
euler(n);
for(int i=1;i<=n;i++)prefix[i]=prefix[i-1]+(int)(!vis[i]&&!vis[i/2]);
while(q--)
{
int l,r;cin>>l>>r;
cout<<prefix[r]-prefix[l-1]<<endl;
}
return 0;
}

692

被折叠的 条评论
为什么被折叠?



