1、素数
prime.c/cpp/pas
1s/256M
【题目描述】
给定整数n,求q次询问的区间[i,j]内的素数个数,1<i,j<=n。
【输入格式】
输入文件:prime.in,第一行两个数n,q,接下来q行,每行两个数i,j,表示要求区间[i,j]内的素数的个数。
【输出格式】
输出文件:prime.out,q行,每行一个数,即题目所求答案。
【输入样例】
20 3
2 5
3 12
6 20
【输出样例】
3
4
5
【数据范围】
对于30%的数据,1<n<=10^4,1<q<=100
对于100%的数据,1<n<=10^7,1<q<=100000
#include<iostream>
using namespace std;
intn,num[10000001]={0},hash[10000001]={0},p[10000001];
int main()
{
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
intm,t=0;
cin>>n>>m;
for(inti=2;i<=n;i++)
{
if(!hash[i])
{
num[i]=num[i-1]+1;
hash[i]=1;
p[++t]=i;
}
elsenum[i]=num[i-1];
for(intj=1;j<=t&&p[j]*i<=n;j++)
{
hash[p[j]*i]=1;
}
}
intx,y;
for(inti=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",num[y]-num[x-1]);
}