质数
时间限制:1秒 内存限制:256M
题目描述
小 X 是一位热爱数学的男孩子,在茫茫的数字中,他对质数更有一种独特的情感。小 X 认为,质数是一切自然数起源的地方。
在小 X 的认知里,质数是除了本身和 1 以外,没有其他因数的数字。
但由于小 X 对质数的热爱超乎寻常, 所以小 X 同样喜欢那些虽然不是质数,但却是由两个质数相乘得来的数。
于是,我们定义,一个数是小 X 喜欢的数,当且仅当其是一个质数,或是两个质数的乘积。
而现在,小 X 想要知道,在 L 到 R 之间,有多少数是他喜欢的数呢?
输入描述
第一行输入一个正整数 Q, 表示询问的组数。
接下来 Q 行。 包含两个正整数 L 和 R。 保证 L≤R。
L,R <= 10^7 Q <= 10^5
输出描述
输出 Q 行, 每行一个整数, 表示小 X 喜欢的数的个数。
样例
输入
1 1 6
输出
5
#include<bits/stdc++.h>
using namespace std;
const N=1e7;
int l,r,q,cnt,prine[N];
bool st[N+5],num[N];
void ola(int m) {
for(int i=2; i<=m; i++) {
if(st[i]==0) {
num[i]=1;
prime[cnt++]=i;
}
for(int j=0;j<cnt&&prime[j]*i<=m;j++) {
st[prime[j]*i]=1;
if(st[i]==0) {
num[prime[j]*i]=1;
}
if(i%prime[j]==0) {
break;
}
}
}
}
int main()
int q;
ola(N);
cin>>q;
for(int i=1;i<N;i++){
sum[i]=sum[i-1]+num[i];
}
while(q--){
cin>>l>>r;
cout<<sum[r]-sum[l-1]<<endl;
}
return 0;
}