Eular质数筛法模板

hihoCoder有一期专门讲解Eular质数筛法, 传送门

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

#define MAX 1000010
bool isprime[MAX];//素数
int primelist[MAX];//保存小于等于N所有的素数
int primecout=0;//素数个数

void soo() {
    for(int i = 2; i <= N; i++) {
        isprime[i] = true;
    }
    for(int i = 2; i <= N; i++) {
        if(isprime[i]) {
            primecout++;
            primelist[primecout] = i;
        }
        for(int j = 1; j <= primecout; j++) {
            if (i * primelist[j] > N) break;
            isprime[i * primelist[j]] = false;
            if(i % primelist[j] == 0) break;
        }
    }
}

int main() {
    cin>>N;
    memset(primelist,0,sizeof(0));
    soo();
    cout<<primecout<<endl;
//    for(int i=1; i<=primecout; i++)
//        cout<<primelist[i]<<endl;
    return 0;
}
时间: 2024-12-28 23:48:34

Eular质数筛法模板的相关文章

数论二&#183;Eular质数筛法

#1295 : 数论二·Eular质数筛法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho:小Hi,上次我学会了如何检测一个数是否是质数.于是我又有了一个新的问题,我如何去快速得求解[1,N]这个区间内素数的个数呢? 小Hi:你自己有什么想法么? 小Ho:有!我一开始的想法是,自然我们已经知道了如何快速判定一个数是否是质数,那么我就直接将[1,N]之间每一个数判定一次,就可以得到结果.但我发现这个方法太笨了. 小Hi:确实呢,虽然我们已经通过快速素数检测将每

Eular质数筛法-hiho一下 第九十三周

Eular质数筛法 hihocoder第九十三周 输入 第1行:1个正整数n,表示数字的个数,2≤n≤1,000,000. 输出 第1行:1个整数,表示从1到n中质数的个数 c++代码 #include <iostream> #include <sstream> #include <fstream> #include <string> #include <vector> #include <deque> #include <qu

Eular质数筛法

小Hi:我们可以知道,任意一个正整数k,若k≥2,则k可以表示成若干个质数相乘的形式.Eratosthenes筛法中,在枚举k的每一个质因子时,我们都计算了一次k,从而造成了冗余.因此在改进算法中,只利用k的最小质因子去计算一次k. 首先让我们了解一下Eular筛法,其伪代码为: isPrime[] = true primeList = [] primeCount = 0 For i = 2 .. N If isPrime[i] Then primeCount = primeCount + 1

51Nod - 1181 质数中的质数(质数筛法)

如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input输入一个数N(N <= 10^6)Output输出>=N的最小的质数中的质数.Sample Input 20 Sample Output 31 用eular质数筛即可 1 #include<iostream> 2 #include<cstdio>

质数筛法详解

理论及实现 定义: 若一个正整数无法被除了1和它本身的之外的任何自然数整除,则称该为质数(素数),否则称该正整数为合数. 判定方法 试除法 引理: 若一个正整数\(N\)为合数,则存在一个能整除\(N\)的数\(T\)且\(2≤T≤ \sqrt N\) 证明就不再赘述,读者可以自行验证: 因此,我们只需要枚举\(2-\sqrt N\).只要这之中的所有数都不能被\(N\)整除,那么\(N\)就是质数了: #include<cmath> bool is_prime(int n) { if(n &

1181 质数中的质数(质数筛法)

1181 质数中的质数(质数筛法) 基准时间限制:1 秒 空间限制:131072 KB 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input 输入一个数N(N <= 10^6) Output 输出>=N的最小的质数中的质数. Input示例 20 Output示例 31 #include <cstdlib>

改进筛法- 质数中的质数(质数筛法)

1181 质数中的质数(质数筛法) 题目来源: Sgu 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input 输入一个数N(N <= 10^6) Output 输出>=N的最小的质数中的质数. Input示例 20 Output示例 31 最常

1181 质数中的质数(质数筛法)(51NOD基础)

1181 质数中的质数(质数筛法)(51NOD基础) 题目来源: Sgu 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 如果一个质数,在质数列表中的编号也是质数,那么就称之为质数中的质数.例如:3 5分别是排第2和第3的质数,所以他们是质数中的质数.现在给出一个数N,求>=N的最小的质数中的质数是多少(可以考虑用质数筛法来做). Input 输入一个数N(N <= 10^6) Output 输出>=N的最小的质数中的质数. Input示例 20 Outpu

埃拉托色尼质数筛法

所谓质数的筛法,就是在一个给定的区间中判断哪些数是质数,哪些数不是质数 这是OI常用质数筛选方法的第一种——Eratosthnes 用到的性质是 质数的倍数一定不是质数 所以我们就可以先定义一个数组,起初 认为这个数组中所有的全部都是质数,然后通过循环一次一次的把质数的倍数置 成true,意为它是合数. 由于这个算法不能确定唯一产生合数的方式,比如20,这个合数会被质数2筛选 一次,也会被质数5筛选一次,所以这个算法不是最快的质数筛法,它的复杂度 是O(nlognlogn). 注意:1既不是质数