m(m<=1e6)次提问,给出一个区间[l,r] (1<=l<=r<=1e6)答在这个区间段内最小,最大素数,以及这个区间中素数的个数
输入格式:
第一行为一个正整数m,表示问题的个数
接下来m行是两个正整数l,r表示一次询问的区间
输出格式:
针对每次查询,都要输出一行三个正整数(用空格隔开,行末没有多余空格),分别表示:最小素数,最大素数,素数的个数.(题目保证所给区间中至少有一个素数)
输入样例:
在这里给出一组输入。例如:
3
1 5
10 12
2 8
输出样例:
在这里给出相应的输出。例如:
2 5 3
11 11 1
2 7 4
注意:
cnt数组的使用
cin会超时
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<vector>
#include<cstring>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn = 1e6;
int tot = 0;
bool prime[maxn+5];
int p[maxn+5];
int cnt[maxn+5]; //保存素数个数
void init(){
prime[0] = prime[1] = 1;
int t = 0;
for(int i=2; i<=maxn; i++){
if(prime[i]==0){
p[++tot] = i;
cnt[i] = ++t;
}
else
cnt[i] = t;
for(int j=1; j<=tot && i*p[j]<=maxn; j++){
prime[i*p[j]]=1;
if(i%p[j]==0)
break;
}
}
}
int main(){
int m,a,b;
init();
scanf("%d",&m);
while(m--){
scanf("%d %d",&a,&b);
int l = cnt[a];
if(prime[a])
l++;
int ans = cnt[b] - cnt[a];
if(prime[a]==0) ans++;
printf("%d %d %d\n",p[l],p[cnt[b]],ans);
}
return 0;
}