xtu oj 1618 素数个数

文章目录

  • 前言
  • 代码
  • 思路

前言

有点儿难,至少对我来说。去年考试我没写出来。

代码

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>//加 math 那个头文件好像要加这个头文件,我之前编译错误过,血泪教训
#include<math.h>
#define N 1000010
#define LL long long 
bool is_prime[N];//存 1 到 10^6 的数字是不是素数
bool is_prime1[N];//存映射之后的 r-l 区间的数字是不是素数,false 表示不是素数,true 表示是素数
void Eratosthenes(int n) {//这个是复制的埃氏筛法的模板is_prime[0] = is_prime[1] = false;for (int i = 2; i <= n; ++i) is_prime[i] = true;for (int i = 2; i <= n; ++i) {if (is_prime[i]) {//prime.push_back(i);这个不要用,我就注释掉了,因为这里用数组 is_prime 数组的下标表示这个数字是啥就行了if ((long long)i * i > n) continue;for (int j = i * i; j <= n; j += i)// 因为从 2 到 i - 1 的倍数我们之前筛过了,这里直接从 i// 的倍数开始,提高了运行速度is_prime[j] = false;  // 是 i 的倍数的均不是素数}}
}
int get_ans(LL l,LL r){int max_prime=sqrt(r)+10;//这里是算最大的可能的因子,也不是最大的因子,就是那个试除法求因子 i*i<=n 的那个意思//避免掉边界问题,所以扩大了一些,向上取整或者加1都行,//但是不加的话,可能会出现一些问题,因为 sqrt 之后强制转换可能//有一些精度损失Eratosthenes(max_prime);//求素数因子for(int i=0;i<=r-l;i++){//假设最开始的时候区间里面全是素数is_prime1[i]=true;//假设开始的时候,映射之后的 [l,r] 这个区间,全是素数,注意 [l,r] 有 r-l+1 个数字}//比如[1,3] 有三个数字 3-1+1=3for(long long i=0;i<max_prime;i++){//这里遍历的是因子if(is_prime[i]){//只需要用素数因子,博客里面说了原因LL st=(l/i)*i;//求的是这个素数因子的在 l 右边的最小的倍数,st 是 start 的简写,这里比较复杂,下面博客里面会详细解释一下if(st<l){//让这个起点出现在 l 的右边st+=i;}if(st==i){//防止把素数给筛掉了st+=i;}for(long long j=st;j<=r;j+=i){//把素数因子的倍数筛掉is_prime1[j-l]=false;}}}int cnt=0;for(int i=0;i<=r-l;i++){//把 [l,r] 这个区间的数字映射到 [0,r-l] ,都是 r-l+1 个数字if(is_prime1[i]&&(l+i)>1){//(l+i)>1 的意思是只有 >=2 才有可能是素数cnt++;}}return cnt;
}
int main(){int t;scanf("%d",&t);while(t--){LL l,r;scanf("%lld%lld",&l,&r);int ans=get_ans(l,r);printf("%d\n",ans);}return 0;
}

思路

埃氏筛法,来自 oi-wiki

vector<int> prime;
bool is_prime[N];void Eratosthenes(int n) {is_prime[0] = is_prime[1] = false;for (int i = 2; i <= n; ++i) is_prime[i] = true;for (int i = 2; i <= n; ++i) {if (is_prime[i]) {prime.push_back(i);if ((long long)i * i > n) continue;for (int j = i * i; j <= n; j += i)// 因为从 2 到 i - 1 的倍数我们之前筛过了,这里直接从 i// 的倍数开始,提高了运行速度is_prime[j] = false;  // 是 i 的倍数的均不是素数}}
}

时间复杂度是 O(n log log n) ,差不多就是线性的了,不过我学过线性筛之后没用过这个了,奥不对,其实是筛法我都没咋用过。

有一点需要说明,就是任何一个非素数数字可以被表示成若干个素数的乘积,这个结论非常重要,请记住这句话再往下看。假设我们直接用埃氏筛法和前缀和处理该题,因为 l 和 r 的数据范围是 10^9 ,哪怕时间复杂度是线性的,都超过了我们需要的 10^7 ,题干里面说 r-l<=10^6 ,那么对于这个区间我们用线性的做法是可以的。对于质数类型的题,有一个试除法求因子,也就是 i*i<=n ,我们枚举出 sqrt(n) 就能找到 n 的所有的因子,时间复杂度是根号的,10^9 开根号,这个时间复杂度我们是可以接受的。所以我们要想办法把 [l,r] 这个区间的数字的素数因子找到,然后用素数因子筛一遍这个区间的数字,就能找到这个区间的素数了。

这个 [l,r] 区间的因子只有素数因子是有意义的。因为非素数因子,可以拆解成更小的素数因子的乘积。(请看上一段第一句话)。那么 [l,r] 这个区间需要找到的最大的素数因子只要控制在 sqrt r 之内就可以了,用试除法找因子,相当于筛两遍。第一遍筛素数因子,第二遍用素数因子筛 [l,r] 区间的 r-l+1 个数字。

在这里插入图片描述

还有注意一下,两个数字都是 10^9 ,稍微乘一个数字,都可能爆 int ,所以这里用了 long long

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

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

相关文章

2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免

2024149读书笔记|Hans的阿狸五部曲——成长的路上分离在所难免 1. 《阿狸和小小云》2. 《阿狸和小玉》3. 《阿狸呓语》4. [202480读书笔记|《阿狸和弯月亮》——生的再普通&#xff0c;也是限量版](https://blog.csdn.net/qq_40985985/article/details/139731131)5. 《阿狸永远…

Atcoder ABC383

C BFS。放入所有的H点&#xff0c;bfs在D步内能访问到的点。 #include <bits/stdc.h> using namespace std;typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi;int h, w, d; string s[1100]; in…

Xcode模拟器运行报错:The request was denied by service delegate

Xcode模拟器运行报错&#xff1a;The request was denied by service delegate 造成的原因: &#xff08;1&#xff09;新的苹果M系列芯片的Mac电脑 &#xff08;2&#xff09;此电脑首次安装启动Xcode的应用程序 &#xff08;3&#xff09;此电脑未安装Rosetta 2 解决方法: …

SQL项目实战与综合应用——项目设计与需求分析

项目设计与需求分析是软件开发过程中的核心环节&#xff0c;尤其在涉及数据库的应用时&#xff0c;良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践&#xff0c;结合 C 与 SQL 的实际应用场景&#xff0c;涵盖项目需求收集、数据库设…

Python+OpenCV系列:图像的位运算

文章目录 引言 1. 位运算简介2. OpenCV 中的位运算2.1 按位与运算&#xff1a;cv2.bitwise_and()2.2 按位或运算&#xff1a;cv2.bitwise_or()2.3 按位异或运算&#xff1a;cv2.bitwise_xor()2.4 按位取反运算&#xff1a;cv2.bitwise_not() 3. 位运算在图像处理中的应用3.1 图…

高效的 Python Web 开发与数据库操作:基于 FastAPI 的实战与优化

高效的 Python Web 开发与数据库操作&#xff1a;基于 FastAPI 的实战与优化 目录 &#x1f40d; 1. 数据库连接池的使用与管理&#x1f504; 2. 数据库事务的处理与控制&#x1f4a1; 3. FastAPI 中的 ORM 集成与优化 &#x1f40d; 1. 数据库连接池的使用与管理 数据库连接…

D3实现站点路线图demo分享

分享一下通过D3实现的站点路线分布图&#xff0c;这是一个demo。效果图如下&#xff1a; 源码如下&#xff1a; <template><div class"map-test" ref"d3Chart"><div class"tooltip" id"popup-element"><span>…

CTF-WEB: 配置一个Ubuntu 多版本php服务器

今天复现题windows的php /tmp缓存一直是空的,直接配一个新虚拟机 开始 准备一个全新的虚拟机,可以在这里下载镜像 Verifying - USTC Mirrors 走完常规安装流程继续 设置中文(可选) sudo apt install language-pack-zh-hans language-pack-gnome-zh-hans然后在设置->语…

python爬虫--小白篇【爬虫实践】

一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接&#xff0c;将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤&#xff1a; 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id&#xff1b;根据单个英雄的hero_name和h…

算法日记 42 day 图论

今天来看看广度优先搜索&#xff0c;并且写几个题。刷到这里我才想起来&#xff0c;当时第一次面试的时候问的就是这个题&#xff0c;当时大概知道一点思路&#xff0c;但不清楚是图论方面的&#xff0c;更别说写出来了。 广度优先搜索&#xff08;BFS&#xff09; 不同于深度…

【NLP 13、实践 ② 判断文本中是否有特定字符出现】

人活着就是为了救赎自己&#xff1b;为了经历世间的美好&#xff1b;为了在挫折中成长变得更坚强 —— 24.12.10 一、定义模型 1.嵌入层 nn.Embedding&#xff1a;将离散值转化为向量 # embedding层&#xff0c;vocab&#xff1a;词表&#xff0c;要多少个数据&#xff08;向…

软件注册机 | QT给自己的桌面软件实现软件注册码功能

之前做的一个项目&#xff0c;想要给软件做一个注册码功能。当软件发布之后&#xff0c;不想给所有人用&#xff0c;这时就可以通过注册机给软件生成授权码来软件加密。整个过程实现分为两大步骤&#xff0c;一是在自己的软件打开时&#xff0c;增加一段判断逻辑&#xff1b;二…

GD32中断

1.什么是中断&#xff1a;打断现在正在做的事&#xff0c;去执行其他事。 2.ARM异常中断结构 3.中断向量编号。中断向量是 进行了映射的&#xff0c;直接映射到 flash中的地址。 4.中断执行结构。向量里面保存的是执行函数的地址。&#xff08;具体可在编译完后的map文件中查看…

三菱FX3U模拟量产品的介绍

FX3u可编程控制器模拟量产品包括&#xff1a;特殊适配器、特殊功能模块的连接 1、连接在FX3U可编程控制器的左侧。 2、连接特殊适配器时&#xff0c;需要功能扩展板。 3、最多可以连接4台模拟量特殊适配器。 4、使用高速输入输出特殊适配器时&#xff0c;请将模拟量特殊适配器连…

WHAT - webpack、vite(rollup)、rsbuild 对比

目录 一、分析二、其他阅读 一、分析 以下是 Webpack、Vite 和 rsbuild 在多个维度上的比较分析表格&#xff1a; 维度WebpackVitersbuild核心语言/技术使用 JavaScript 和 Node.js基于 JavaScript/TypeScript&#xff0c;依赖原生 ESM 和浏览器支持使用 Rust 编写&#xff0…

软件测试丨Appium 源码分析与定制

在本文中&#xff0c;我们将深入Appium的源码&#xff0c;探索它的底层架构、定制化使用方法和给软件测试带来的优势。我们将详细介绍这些技术如何解决实际问题&#xff0c;并与大家分享一些实用的案例&#xff0c;以帮助读者更好地理解和应用这一技术。 Appium简介 什么是App…

【PlantUML系列】流程图(四)

目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字&#xff1b;结束一般使用stop/end关键字。基础用法包括&#xff1a; start ... stopstart ...…

Linux 串口编程

目录 前言一、tty体系二、串口硬件基础知识三、Linux下的串口编程3.1 打开串口3.2 从串口读写数据,问题1、2的诞生3.3 关闭串口3.4 串口配置3.4.1 获取/设置串口的参数3.4.2 设置波特率3.4.3 设置控制模式标志3.4.4 设置本地模式标志3.4.5 设置输入模式标志3.4.6 设置输出模式标…

️【设计模式】之单例模式详解:创建者模式中的一颗“明珠”

全文目录&#xff1a; 开篇语&#x1f3af; 什么是单例模式&#xff1f;&#x1f5c2;️ 单例模式的关键特性&#x1f511; 单例模式的实现方式1. &#x1f331; 懒汉式单例&#xff08;Lazy Initialization&#xff09;2. &#x1f512; 懒汉式单例&#xff08;线程安全版&…

idea压缩js,css

这是需要的jar包(文章顶部也可以下载) 地址:https://download.csdn.net/download/yuzheh521/90109966?spm1001.2101.3001.9500 压缩js arguments: -jar E:\swj\jar_packages\css_js_compress\yuicompressor-2.4.8.jar --type js --charset utf-8 $FilePath$ -o $FileNameWith…