Animals
蒟蒻

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;
}

 

  

 

posted @ 2018-10-29 20:29  年下丶  阅读(136)  评论(0编辑  收藏  举报
--- 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 百里守约 ---