zoukankan      html  css  js  c++  java
  • 【埃氏筛】洛谷P3383埃氏筛模板

    思路:

    如果我们要筛出 [1, n] 内的所有素数,使用 [1, √n] 内的素数去筛就可以了

    设bool型数组 a,a[i] 表示 i 是否被某个素数筛过

    从 2 开始枚举每个数 i:

    若 a[i] = false,表示 i 没有更小的素因子,从而知道 i 是素数。枚举 i 的所有倍数 j,令 a[j] = 1

    这样就可以在线性复杂度内预处理出比较大的区间的素数

    代码如下:

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    int n,m;
    bool a[10050000];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        a[1]=1;
        for(int i=2;i*i<=n;++i)
        {
            if(a[i])continue;
            for(int j=i;i*j<=n;++j)
                a[i*j]=1;
        }
        int j;
        for(int i=1;i<=m;++i)
        {
            scanf("%d",&j);
            if(a[j])printf("No
    ");
            else printf("Yes
    ");
        }
    }

     然后附上线性筛【毕竟是线性复杂度2333】

    代码

    #include<cstdio>
    #include<iostream>
    using namespace std;
    
    int n,m,num,su[10050000];
    bool a[10050000];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        a[1]=1;
        for(int i=2;i<=n;++i)
        {
            if(!a[i])su[++num]=i;
            for(int j=1;j<=num&&i*su[j]<=n;++j)
            {
                a[i*su[j]]=1;
                if(i%su[j]==0)break;
            }
                
        }
        int j;
        for(int i=1;i<=m;++i)
        {
            scanf("%d",&j);
            if(a[j])printf("No
    ");
            else printf("Yes
    ");
        }
    }
  • 相关阅读:
    配置Keepalived双主热备
    配置 Keepalived
    Keepalived安装部署
    Keepalived配置Nginx自动重启
    Collectiont和Collections的区别
    HashMap和Hashtable的联系和区别
    Vector和ArrayList的联系和区别
    ArrayList和LinkedList 的联系和区别
    集合和数组的比较
    struts下载
  • 原文地址:https://www.cnblogs.com/rir1715/p/6808584.html
Copyright © 2011-2022 走看看