线性筛素数(欧拉筛)
欧拉筛是O(n)复杂度的筛素数算法,1秒内埃筛能处理1e6的数据,而1e7的数据就必须用欧拉筛了。
埃筛的基本思想是:素数的倍数一定是合数。
欧拉筛基本思想是:任何数与素数的乘积一定是合数
算法概述:
遍历[2, n]
的所有数i
,内层循环遍历已经找到的素数prime[j]
,将i * prime[j]
标记为合数。
内层循环的最后,检查如果prime[j]
是i
的最小质因子,则退出到外层循环,因为prime[j+1] * i
肯定已经被筛过了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e7 + 5;
int isPrime[MAXN]; // isPrime[i] 表示i是否素数
int prime[MAXN]; // 按顺序存素数
int cnt = 0; // 素数个数// 找出n以内的全部(cnt个)素数
void euler(int n) { memset(isPrime, 1, sizeof(isPrime)); // 默认全是素数cnt = isPrime[0] = isPrime[1] = 0; // 素数个数清零,标记0和1不是素数// 已知 [2, n] 之间的每一个数 i 与任意素数的乘积一定是合数,// 遍历已找到全部素数 prime[j],将 i * prime[j] 标记为合数for (int i = 2; i <= n; i++) {if (isPrime[i]) prime[cnt++] = i; // 找到素数 for (int j = 0; j < cnt; j++) { // 遍历已找到的素数if (i * prime[j] > n) break; // 越界跳出isPrime[i * prime[j]] = 0; // 标记合数// 避免重复筛除的关键代码// 当找到i的最小质因子 prime[j] 时,退出循环if (i % prime[j] == 0) break;}}
}int main() {int n; cin >> n;euler(n);// for (int i = 0; i < cnt; ++i) cout << prime[i] << endl; // 打印素数cout << "cnt:" << cnt << endl;return 0;
}
线性筛素数(欧拉筛)相关推荐
- [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉
本文为博主原创文章,欢迎转载,请注明出处 www.cnblogs.com/yangyaojia [SDOI2008]沙拉公主的困惑 线性筛 素数+欧拉 题目大意 给定n,m,求在1到n!内与m!互质的 ...
- 埃氏筛与欧拉筛(线性筛)
目录 一.前言 二.埃氏筛与欧拉筛(线性筛) 1.问题描述 2.基本思路 (1)埃氏筛法 (2)欧拉筛法 三.题例 1.上链接 2.简单思路 3.代码 (1)埃氏筛python版 (2)欧拉筛pyth ...
- 筛选质数,埃氏筛和欧拉筛(线性筛)
求len之内的所有的素数 除了比较常用的开根号的求法,还有两种更好的方法,埃氏筛和线性筛.其中埃氏筛更好理解,而线性筛(欧拉筛)不好理解但是更快. 埃氏筛 #include <bits/stdc ...
- 素数筛法详解:埃氏筛和欧拉筛
文章目录 摘要 埃式筛 欧拉筛 超级详细的基础算法和数据结构合集: https://blog.csdn.net/GD_ONE/article/details/104061907 摘要 本文主要介绍埃氏 ...
- 算法笔记--素数筛(朴素筛,埃式筛,欧拉筛)
素数 素数也叫质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数.如2 , 3 , 5 , 7 , 11等. 素数筛 素数筛即筛选出1~n内的素数的方法,这里介绍三种 常见的求素数 ...
- 【筛质数】——朴素筛,埃式筛,欧拉筛
题目描述: 题目分析: 这道题可以用,朴素筛,埃氏筛,欧拉筛来写. 普通筛: 时间复杂度:O(n logn) 时间复杂度太高,会超时的!!(9/10) #include <iostream> ...
- 线性筛(欧拉筛)——算法解析
算法简介: 欧拉筛是一个能够做到O(n)O(n)O(n)的时间复杂度,也就是线性的质数筛法,是目前性能最优秀的质数筛法.在很多算法和数据结构题目中都有大量的应用,是一个十分基础的工具.对于一个频繁使用 ...
- 信奥日记——数论(快速幂、埃氏筛、欧拉筛)
文章目录 前情提要 正文 1.快速幂 思路 代码 完整代码(包含取模) 2.埃拉托斯特尼筛法(埃氏筛) 原理 思路 代码 完整代码(求 2 到 n 之间的素数) 3.线性筛 思路 代码 完整代码 前情 ...
- 线性筛法 欧拉筛c语言,[洛谷P3383][模板]线性筛素数-欧拉筛法
Hibernate Hql 总结 1.from子句 Hibernate中最简单的查询语句的形式如下: from eg.Cat该子句简单的返回eg.Cat类的所有实例. 通常我们不需要使用类的全限定名, ...
- 素数-欧拉筛-Python实现
返回小于n的所有素数 def EulerSieve(n: int):filter, primers = [False for _ in range(n + 1)], []for i in range( ...
最新文章
- Ubuntu 12.04安装Sun JDK 6
- 求求你使用Tab键好吗
- x509代码实例java_Java X509AttributeCertificate.getIssuer方法代码示例
- axi ps读写pl_PL读写DDR:Datamover能干什么
- 3.5 RNN 字符级语言模型
- CRC校验算法及C++程序实现
- [Linux]history命令用法详解
- tcc-transaction深入理解
- Flask Marshmallow基本使用
- Java中打印程序执行的开始时间和结束时间
- 理解c函数执行完后,释放内存
- COA-2019-第十四章 Instruction Sets
- 为什么需要使用云计算技术?
- h5前端IE浏览器低版本判断及升级提示
- 模拟量输入、输出应用举例
- 2021年危险化学品经营单位安全管理人员考试内容及危险化学品经营单位安全管理人员考试试卷
- 清理桌面状态下鼠标右键“打开好桌道壁纸”选项
- 2020-11-11,单身快乐
- php 大量数导出表格 打包成zip
- c语言上机考题库,C语言上机考题库.doc