Day1-T2
原题目
在小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; }