[洛谷P3383][模板]线性筛素数-欧拉筛法

时间:2021-05-30 08:19:50

Description

  • 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内)

Input&Output

Input

  • 第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。
  • 接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。

    Output

  • 输出包含M行,每行为Yes或No,即依次为每一个询问的结果。

Solution

  • 欧拉筛法的优势在于,在当前i mod 当前素数为0时就退出,保证了每个合数一定只被它的最小素因子筛掉,从而在O(n)时间内完成。
  • 代码如下:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int num[100000];
    long long prime[5000001];
    bool is_prime[10000001];
    int N,M;
    int cnt=1;
    int main()
    {
    for(int k=0;k<10000001;k++)
    {
        is_prime[k]=true;
    }
    cin>>N>>M;
    is_prime[0]=false;
    is_prime[1]=false;
    is_prime[2]=true;
    prime[1]=2;
    for(int i=2;i<N;i++)
    {
       if(is_prime[i]==true){prime[cnt]=i;cnt++;}
       for(long long j=1;j<=cnt&&prime[j]*i<=N;j++)
       {
           is_prime[prime[j]*i]=false;
           if(i%prime[j]==0)break;
       }
    }
    for(int i=0;i<M;i++)
    {
        cin>>num[i];
        if(is_prime[num[i]]==false)cout<<"No"<<endl;
        else cout<<"Yes"<<endl;
    }
    return 0;
    }