P3383 【模板】线性筛素数

传送门

线性筛法

让每个合数只被它最小的素因数筛到

从而保证每个数均摊复杂度为O(1)

总复杂度O(n)

具体看模板

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const int N=10000007;
int n,m,pri[N],cnt;//pri存素数
bool not_pri[N];
//not_pri判断是否是素数,1代表不是,0代表是
int main()
{
    cin>>n>>m;
    not_pri[1]=1;//1不是素数
    for(int i=2;i<=n;i++)
    {
        if(!not_pri[i]) pri[++cnt]=i;//更新素数
        for(int j=1;j<=cnt;j++)
        {
            int t=i*pri[j];
            if(t>n) break;
            not_pri[t]=1;//筛素数
            if(i%pri[j]==0) break;//核心,保证每个数只被它最小的素因数筛到
            //后面所有大于pri[j]的素数*i = pri[j]*k(k>i)
        }
    }
    int a;
    while(m--)
    {
        scanf("%d",&a);
        if(not_pri[a]) printf("No\n");
        else printf("Yes\n");
    }
    return 0;
}

 

posted @ 2018-09-13 13:54  LLTYYC  阅读(338)  评论(0编辑  收藏  举报