zoukankan      html  css  js  c++  java
  • 【模板】线性筛素数

    P3383 【模板】线性筛素数

    题目描述

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

    输入输出格式

    输入格式:

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

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

    输出格式:

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

    输入输出样例

    输入样例#1: 
    100 5
    2
    3
    4
    91
    97
    输出样例#1: 
    Yes
    Yes
    No
    No
    Yes

    说明

    时空限制:500ms 128M

    数据规模:

    对于30%的数据:N<=10000,M<=10000

    对于100%的数据:N<=10000000,M<=100000

    样例说明:

    N=100,说明接下来的询问数均不大于100且不小于1。

    所以2、3、97为质数,4、91非质数。

    故依次输出Yes、Yes、No、No、Yes。

    思路:此题埃氏筛素数也可解!O(nloglogn)。

    埃氏筛

    埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。--百度百科

    算法:

    要得到自然数n以内的全部素数,必须把不大于  的所有素数的倍数剔除,剩下的就是素数。给出要筛数值的范围n,找出以内的素数。先用2去筛,即把2留下,把2的倍数剔除掉;再用下一个质数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个质数5筛,把5留下,把5的倍数剔除掉;不断重复下去......。--百度百科

    埃氏筛代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<iomanip>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<map>
    using namespace std;
    bool pd[10000001];
    int main()
    {
        pd[0]=1;pd[1]=1;
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=2;i*i<=n;++i)
        {
            if(pd[i]==0)
            {
                for(int j=2;j*i<=n;++j)
                {
                    pd[j*i]=1;
                }
            }
        }
        for(int i=1;i<=m;++i)
        {
            int a;
            scanf("%d",&a);
            if(pd[a]==1) printf("No
    ");
            else printf("Yes
    ");
        }
        return 0;
    }
  • 相关阅读:
    把数据输出到Word (组件形式)
    把数据输出到Word (非插件形式)
    ASP.NET MVC Jquery Validate 表单验证的多种方式
    GitHub博客hexo建站之设置SSH 密钥(keys)
    文件打开模式和文件对象方法
    字符串的方法及注释
    汉诺塔递归思维
    python中for嵌套打印图形
    float存储
    Queue 笔记
  • 原文地址:https://www.cnblogs.com/poi-bolg-poi/p/10858079.html
Copyright © 2011-2022 走看看