链接:https://ac.nowcoder.com/acm/contest/5929/I
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
多多知道质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
现在他想知道在一个闭区间内,有多少个质数?他会询问多次,请你回答他。
输入描述:
第一行输入一个正整数 T,代表询问次数 (1 ≤ T ≤ 100000)
接下来 T 行,每行输入两个正整数 a,b 表示查询范围为 [ a,b ] (1 ≤ a ≤ 107,a ≤ b ≤ 107)
输出描述:
对于每次询问,输出一个整数,表示在 [ a,b ] 范围内质数的个数
示例1
输入
复制
3
1 10
1 100
1 1000
输出
复制
4
25
168
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const int inf=0x3f3f3f3f;
const int maxn=1e7+5;
int prime[maxn];
bool sf[maxn];
int ans[maxn];
void sushu() ///欧拉筛
{
int num=0;
memset(sf,1,sizeof(sf));
for(int i=2; i<=maxn; i++)
{
if(sf[i]) prime[++num]=i;
for(int j=1; j<=num; j++)
{
if(i*prime[j]>maxn) break;
sf[i*prime[j]]=0;
if(i%prime[j]==0) break;
}
}
sf[1]=0;
sf[0]=0; //1 0 льеп
}
void init() ///前缀数组
{
for(int i=1;i<=maxn;i++)
{
ans[i]=ans[i-1]+sf[i];
}
}
int main()
{
memset(ans,0,sizeof(ans));
sushu();
init();
int t;
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",ans[b]-ans[a-1]); ///闭区间a,b
}
}