原题目
在小X的认知里,质数是除了本身和1以外,没有其他因数的数。
但由于小 X对质数的热爱超乎寻常,所以小X同样喜欢那些虽然不是质数, 但却是由两个质数相乘得来的数。
于是,我们定义一个数小 X喜欢的数,当且仅其是一个质数或是两个质数的乘积。
Input
第一行输入个正整数Q,表示询问的组数。
接下来Q行,包含两个正整数 L和 R,保证 L≤R(1<=L<=R<=10000000)。
Output
输出Q行,每一个整数,表示该区间范围内小X喜欢的数的个数。
S1:
Input
1 1 6
Output
5
Describe:求[L,R]中是质数或两质数乘积的数
code:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
int n,l,r,tot,p[10101010];
int all[10101010],b[10101010];
inline int read(){
int ret=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9') {if (ch=='-') f=-f;ch=getchar();}
while (ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}
inline void write(int x){
if(x<0){putchar('-'),write(-x);return;}
if(x/10)write(x/10);putchar(x%10+'0');
}
int main(){
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
n=read();
for(int i=2;i<=10000000;i++)
{
all[i]=all[i-1]; //线性筛素数
if(b[i]==2)continue;
if(!b[i]) //b[i]=0表示 i 为素数
{
p[++tot]=i;all[i]++;
for(int j=1;j<=tot&&p[j]*i<=10000000;j++)b[p[j]*i]=1; //b[i]=1表示 i 为两个素数乘积
for(int j=i*4;j<=10000000;j+=i)if(!b[j])b[j]=2; //b[i]=2表示 i 为合数
}
else all[i]++;
}
for(int i=1;i<=n;i++)l=read(),r=read(),write(all[r]-all[l-1]),puts(""); //继续前缀和
return 0;
}