算法|数学与数论|素数筛

数学与数论|素数筛

1.判断素数
2.朴素筛
3.埃氏筛
4.欧拉筛(线性筛)

心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。
在这里插入图片描述

质数(素数):
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

判断素数

实践代码:

注意
为什么要用x/i?
x/i与sqrt(x)异曲同工,但是sqrt(x)需要调用sqrt()函数,会拖慢运行速度,所以可以改成i * i <= x,但你i * i如果数据范围稍大一点可能会出现溢出情况,所以此时x/i是非常优的解决方式。

bool isPrime(int x){//O(n)时间复杂度for(int i=2;i<x;i++){if(x%i==0) return false;}return true;
}bool isPrime(int x){//O(sqrt(n))时间复杂度for(int i=2;i<=x/i;i++){if(x%i==0) return false;}return true;
}

常识: 一个合数,一定存在非1非本身的质因子,如4 = 2 * 2。

朴素筛法

朴素筛:又叫试除法
目的:求出1~n中质数的个数
基本思路:O(nlogn):结合判断素数函数isPrime(),遍历从1~n,如果是质数就用prime数组存储记录。

实践代码:

int prime[N];
int cnt=0;
bool isPrime(int x){for(int i=2;i<=x/i;i++){if(x%i==0) return false;}return true;
}
void solve(){int n;cin>>n;for(int i=2;i<=n;i++){if(isPrime(i)) prime[cnt++]=i;}
}

埃氏筛

埃氏筛:通过质数(的倍数)去把所有合数筛掉

实践代码:

int pri[N];//0为素数,1为合数(被筛除),初始化都是素数
int cnt=0;
void ers(int n){for(int i=2;i<=n/i;i++){if(!pri[i]) for(int j=i*i;j<=n;j+=i) pri[i]=1;}for(int i=2;i<=n;i++) if(!pri[i]) cnt++;
}

欧拉筛(线性筛)

由于埃氏筛每一次筛出素数的倍数时会出现重复筛出的操作,拖慢了运行速度,所以我们引进欧拉筛,来对埃氏筛进行优化。

欧拉筛:只需要筛除素数i的k(k<=i)倍,而我们这里用pri数组记录是否为素数时,初始化全为0(即都是素数)
举个例子,比如筛除3的倍数时,我们只需要筛除13,23,33即可,那为什么34=12不被筛除呢, 因为当筛除4的倍数时就能把4*3=12筛掉,避免重复。

实践代码:

int pri[N];
int primes[N];
void ola(int n){int k=0,cnt=0;for(int i=2;i<=n;i++){if(!pri[i]) primes[++k]=i;for(int j=1;primes[j]*i<=n;j++){pri[primes[j]*i]=1;//倍数都置为合数(1)if(i%primes[j]==0) break;//优化的关键}}
}

例题

【模板】线性筛素数

题目背景

本题已更新,从判断素数改为了查询第 k k k 小的素数
提示:如果你使用 cin 来读入,建议使用 std::ios::sync_with_stdio(0) 来加速。

题目描述

如题,给定一个范围 n n n,有 q q q 个询问,每次输出第 k k k 小的素数。

输入格式

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

接下来 q q q 行每行一个正整数 k k k,表示查询第 k k k 小的素数。

输出格式

输出 q q q 行,每行一个正整数表示答案。

样例 #1

样例输入 #1

100 5
1
2
3
4
5

样例输出 #1

2
3
5
7
11

提示

【数据范围】
对于 100 % 100\% 100% 的数据, n = 1 0 8 n = 10^8 n=108 1 ≤ q ≤ 1 0 6 1 \le q \le 10^6 1q106,保证查询的素数不大于 n n n

Data by NaCly_Fish.

实践代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define INF = 0x3f3f3f3f//无穷大
#define PII pair<int,int>
const int N = 1e5+10;
const int mod = 1e9+7;
int pri[N];
int primes[N];
void ola(int n){//欧拉筛int k=0,cnt=0;for(int i=2;i<=n;i++){if(!pri[i]) primes[++k]=i;for(int j=1;primes[j]*i<=n;j++){pri[primes[j]*i]=1;//倍数都置为合数(1)if(i%primes[j]==0) break;//优化的关键}}
}
void solve(){int n,q;cin>>n>>q;ola(n);while(q--){int k;cin>>k;cout<<primes[k]<<endl;}
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int t=1;//cin>>t;while(t--){solve();}return 0;
}

心有猛虎,细嗅蔷薇。再见了朋友~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769002.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【教程】高效数据加密混淆方法及实现简介

背景 在需要对数据进行传输或者表达时&#xff0c;通常要求数据加密的安全级别不高&#xff0c;但希望加解密时间复杂度尽可能低。这时使用传统的对称加密&#xff08;如3DES、AES&#xff09;或非对称加密&#xff08;如RSA、ECC&#xff09;显然不太适合。因为加密的安全级别…

【MySQL】10. 复合查询(重点)

复合查询&#xff08;重点&#xff09; 前面我们讲解的mysql表的查询都是对一张表进行查询&#xff0c;在实际开发中这远远不够。 1. 基本查询回顾 数据还是使用之前的雇员信息表 在标题7的位置&#xff01; mysql> select * from emp where sal > 500 or job MANAG…

【数据结构取经之路】队列循环队列

目录 引言 队列的性质 队列的基本操作 初始化 判空 销毁 队列的长度 插入 删除 返回队头元素 循环队列 假溢出 空与满的判定 实现 初始化 插入 判空 销毁 删除 返回队列长度 返回队列头元素 判满 引言 队列和栈一样&#xff0c;也是数据结构的一种&…

特征工程 | 数据清洗、异常值处理、归一化、标准化、特征提取

目录 一. 数据清洗1. 数据清洗&#xff1a;格式内容错误数据清洗2. 数据清洗&#xff1a;逻辑错误清洗3. 数据清洗&#xff1a;去除不需要的数据4. 数据清洗&#xff1a;关联性验证 二. 异常值的处理1. 删除2. 填充 三. 归一化和标准化1. 归一化2. 标准化 四. 特征提取1. One-H…

MyBatis是纸老虎吗?(六)

经过前面一些列文章的梳理&#xff0c;我们已将MyBatis框架所需要的资源都准备好了&#xff1a;数据库连接信息储存在Configuration对象中的Environment属性中&#xff08;该对象中有这样几个属性String类型的id&#xff0c;TransactionFactory类型的transactionFactory、DataS…

如何优雅的爬取公众号文章

目录 相关函数库介绍 代码例子 IP池免费送 相关函数库介绍 在合法合规的前提下&#xff0c;爬取微信公众号文章可以使用以下几个Python库&#xff1a; requests&#xff1a;这是一个非常流行的HTTP库&#xff0c;用于发送各种HTTP请求。它简单易用&#xff0c;能够高效地处…

关于序列化和反序列化

什么是序列化&#xff0c;什么是反序列化 简单来说&#xff1a; 序列化&#xff1a;将数据结构或对象转换成二进制字节流的过程反序列化&#xff1a;将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程 为什么要进行序列化 我们要将java对象进行网络传输&a…

TorchAcc:基于 TorchXLA 的分布式训练框架

演讲人&#xff1a;林伟&#xff0c;阿里云研究员&#xff0c;阿里云人工智能平台 PAI 技术负责人 本文旨在探讨阿里云 TorchAcc&#xff0c;这是一个基于 PyTorch/XLA 的大模型分布式训练框架。 过去十年 AI 领域的显著进步&#xff0c;关键在于训练技术的革新和模型规模的快…

详细剖析多线程2----线程安全问题(面试高频考点)

文章目录 一、概念二、线程不安全的原因三、解决线程不安全问题--加锁&#xff08;synchronized&#xff09;synchronized的特性 四、死锁问题五、内存可见性导致的线程安全问题 一、概念 想给出⼀个线程安全的确切定义是复杂的&#xff0c;但我们可以这样认为&#xff1a; 在多…

立体统计图表绘制方法(凸显式环图)

立体统计图表绘制方法&#xff08;凸显式环图&#xff09; 记得我学统计学的时候&#xff0c;那些统计图表大都是平面的框框图&#xff0c;很呆板&#xff0c;就只是表现出统计的意义就好了。在网络科技发展进步的当下&#xff0c;原来一些传统的统计图表都有了进一步的创新。在…

RDGCN翻译

RDGCN翻译 Relation-Aware Entity Alignment for Heterogeneous Knowledge Graphs 面向异质知识图谱的关系感知实体对齐 阅读时间&#xff1a;2024.03.24 领域&#xff1a;知识图谱&#xff0c;知识对齐 作者&#xff1a;Yuting Wu等人 PKU 出处&#xff1a;IJCAI Abstract…

HarmonyOS NEXT应用开发之听歌识曲水波纹特效案例

介绍 在很多应用中&#xff0c;会出现点击按钮出现水波纹的特效。 效果图预览 使用说明 进入页面&#xff0c;点击按钮&#xff0c;触发水波纹动画。再次点击按钮&#xff0c;停止水波纹动画。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a; 要实现存在两个连续…

C++ - 类和对象(上)

目录 一、类的定义 二、访问限定符 public&#xff08;公有&#xff09; protected&#xff08;保护&#xff09; private&#xff08;私有&#xff09; 三、类声明和定义分离 四、外部变量和成员变量的区别与注意 五、类的实例化 六、类对象的模型 七、类的this指针…

TCP详解

一、TCP报文段结构 1、源端口号和目的端口号都是16位&#xff0c;范围从&#xff08;1-65535&#xff0c;0不可用&#xff09; 2、序列号&#xff1a;在建立连接时由内核生成的随机数作为其初始值&#xff0c;通过 SYN 报文传给接收端主机&#xff0c;每发送一次数据&#xff0…

C语言数据结构易错知识点(5)(插入排序、选择排序)

插入排序&#xff1a;直接插入排序、希尔排序 选择排序&#xff1a;直接选择排序、堆排序 上述排序都是需要掌握的&#xff0c;但原理不会讲解&#xff0c;网上有很多详尽地解释&#xff0c;本文章主要分享一下代码实现上应当注意的事项 1.直接插入排序&#xff1a; 代码实…

拥抱C++的深度和复杂性,挖掘更多可能 !——《C++20高级编程(第5版)》

&#xff0c;C难以掌握&#xff0c;但其广泛的功能使其成为游戏和商业软件应用程序中最常用的语言。即使是有经验的用户通常也不熟悉许多高级特性&#xff0c;但C20的发布提供了探索该语言全部功能的绝佳机会。《C20高级编程(第5版)》为C的必要内容提供了一个代码密集型、面向解…

(AtCoder Beginner Contest 325) ---- D - Printing Machine -- 题解

目录 D - Printing Machine&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; D - Printing Machine&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 打印一次后&#xff0c;需要充电一微秒后才能再次打印就可以看作每微妙只能打印一…

【文献阅读】AlphaFold touted as next big thing for drug discovery — but is it?

今天来精读2023年10月发在《Nature》上的一篇新闻&#xff1a;AlphaFold touted as next big thing for drug discovery — but is it? (nature.com)https://www.nature.com/articles/d41586-023-02984-w Questions remain about whether the AI tool for predicting protein …

蓝桥杯基础练习详细讲解二(具体代码、解题思路、Python)

试题 基础练习 回文数 提交此题 评测记录 资源限制 内存限制&#xff1a;512.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 1221是一个非常特殊的数&#xff0c;它从左边读和从右边读是一样的&#x…

C语言从入门到实战----C语言中内存函数的使用和模拟实现

目录 前言 1.memcpy 使用和模拟实现 2. memmove 使用和模拟实现 3. memset 函数的使用 4. memcmp 函数的使用 前言 在编程领域&#xff0c;内存管理是至关重要的一环&#xff0c;它确保了程序能够高效、稳定地运行。 C语言作为一门底层的编程语言&#xff0c;提供了一系…