题目:click
题意:求l-r中的素数个数。
区间筛,由于l-r中的合数的最小质因数不会大于sqrt( r ),预先处理出sqrt( r )的素数做区间筛。
#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
const int MAX=1e6+10;
int l,r,tot=0;
bool vis[MAX];
bool num[MAX];
int prime[MAX];
void init()
{
memset(vis,false,sizeof(vis));
vis[1]=vis[0]=true;
for(int i=2;i<MAX;i++)
{
if(!vis[i])
{
prime[tot++]=i;
}
for(int j=0;j<tot;j++)
{
if(i*prime[j]>=MAX)
break;
vis[prime[j]*i]=true;
if(i%prime[j]==0)
break;
}
}
}
int main()
{
init();
memset(num,false,sizeof(num));
scanf("%d %d",&l,&r);
for(int i=0;i<tot&&prime[i]*prime[i]<=r;i++)
{
for(ll j=(l/prime[i])*prime[i];j<=r;j+=prime[i])
{
if(j>=l&&j!=prime[i])
{
num[j-l]=true;
}
}
}
int ans=0;
for(int i=0;i<=r-l;i++)
if(!num[i])
ans++;
printf("%d",ans);
return 0;
}