线性筛板子

题目描述

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

输入格式

第一行包含两个正整数N、M,分别表示查询的范围和查询的个数。

接下来M行每行包含一个不小于1且不大于N的整数,即询问该数是否为质数。

输出格式

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

 

 

注意1 已经被筛掉

如果%==0 则停止 会被更大的数筛掉

时间复杂度O(n)

code:

//
#include<bits/stdc++.h>
using namespace std;
#define ll long long 
ll prime[10000010],v[10000010],n,m;
ll len=0;
void shai()
{
    v[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!v[i]) prime[++len]=i;
        for(int j=1;prime[j]*i<=n&&j<=len;j++)
        {
            v[prime[j]*i]=1;
            if((i%prime[j])==0)
            break;
        }
    }
    
}
int main()
{
    cin>>n;
    shai();
    ll x;

    cin>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>x;
        if(v[x])
        puts("No");
        else
        puts("Yes");
    }
    
}

 

posted @ 2019-08-07 11:13  ALEZ  阅读(164)  评论(0编辑  收藏  举报