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.rhkb.cn/news/487683.html

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

相关文章

非文件形式的内存动态函数库调用接口

使用memfd的系统调用接口将动态库加载到proc虚拟文件系统&#xff0c;提供的fd为进程持有的句柄&#xff0c;通过dlopen的path指向此句柄&#xff0c;即可实现非文件系统加载动态链接库。 文章目录 一、memfd_create二、dl_open三、示例参考 一、memfd_create 接口名称int mem…

ElfBoard开源项目|基于百度智能云平台的车牌识别项目

本项目基于百度智能云平台&#xff0c;旨在利用其强大的OCR服务实现车牌号码的自动识别。选择百度智能云的原因是其高效的API接口和稳定的服务质量&#xff0c;能够帮助开发者快速实现车牌识别应用。 本项目使用摄像头捕捉图像后&#xff0c;通过集成百度OCR服务的API&#xf…

【51单片机】程序实验1112.外部中断-定时器中断

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 前置知识&#xff1a;C语言 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 码字不易&#xff0c;求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验11&12.外部中断-定时器…

Linux基础(2)完结

声明 学习视频来自 B 站up主泷羽sec&#xff0c;如有涉及侵权马上删除文章。 在学习的过程中记笔记&#xff0c;分享笔记方便各位师傅学习&#xff0c;以下内容只涉及学习内容&#xff0c;任何其他违法行为与本人及泷羽sec无关&#xff0c;请务必遵守法律法规&#xff0c;切莫逾…

【重生之我在B站学MySQL】

MySQL笔记 文章目录 MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库 表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp 修改表mysql约束primary key(主键)not null(非空)unique(唯一)foreign key(外键)check自增长 索…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

【adb】iqoo系统精简垃圾内置应用

免责声明 这个得谨慎点&#xff0c;虽然我验证过两部手机和不同版本的系统&#xff0c;但是总会有特殊的存在、 本教程来自于互联网搜集整理&#xff0c; 按照本教程造成的用户设备硬件或数据损失&#xff0c;本人概不承担任何责任&#xff0c;如您不同意此协议&#xff0c;请不…

计算机视觉:学习指南

一、引言 计算机视觉作为人工智能领域的一个重要分支&#xff0c;致力于让计算机理解和解释视觉信息&#xff0c;近年来取得了令人瞩目的进展&#xff0c;广泛应用于安防监控、自动驾驶、图像编辑、医学影像分析等众多领域。从入门到精通计算机视觉需要系统地学习一系列知识和…

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…

三菱FX3uPLC输入接线注意事项

FX3u微型控制器(DC输入型)的输入根据外部接线&#xff0c;漏型输入和源型输入都可使用。 但是,一定要连接S/S端子的接线。 详细事宜请参考“FX3U系列微型控制器硬件说明手册 AC电源型的输入接线事例(FX3U-囗MR/UA1除外) DC电源型的输入接线事例 *请不要与(0V)、(24V)端子接线…

一文说清flink从编码到部署上线

引言&#xff1a;目前flink的文章比较多&#xff0c;但一般都关注某一特定方面&#xff0c;很少有一个文章&#xff0c;从一个简单的例子入手&#xff0c;说清楚从编码、构建、部署全流程是怎么样的。所以编写本文&#xff0c;自己做个记录备查同时跟大家分享一下。本文以简单的…

过滤器Filter,ajax异步请求,服务器响应的数据类型,json

1.过滤器Filter 按照过滤规则筛选出想要的资源 很多地方都需要判断是否登录&#xff0c;对每个资源进行判断&#xff0c;非常麻烦&#xff0c;可以使用过滤器在访问这些资源前进行判断。 案例&#xff1a; package com.ghx.filter;import javax.servlet.*; import javax.ser…

【网络协议栈】TCP/IP协议栈中重要协议和技术(DNS、ICMP、NAT、代理服务器、以及内网穿透)

每日激励&#xff1a;“请给自己一个鼓励说&#xff1a;Jack我很棒&#xff01;—Jack” 绪论​&#xff1a; 本章是TCP/IP网络协议层的完结篇&#xff0c;本章将主要去补充一些重要的协议和了解一些网络中常见的名词&#xff0c;具体如&#xff1a;DNS、ICMP、NAT、代理服务器…

服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析

Linux操作系统是世界上流行的操作系统之一&#xff0c;被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统&#xff08;EXT2/EXT3/EXT4/Reiserfs/Xfs&#xff0…

因果推荐CIKM24 | 通过偏好感知因果干预和反事实数据增强来提升序列推荐

论文来源&#xff1a;CIKM 24 论文链接&#xff1a;PACIFIC: Enhancing Sequential Recommendation via Preference-aware Causal Intervention and Counterfactual Data Augmentation | Proceedings of the 33rd ACM International Conference on Information and Knowledge …

如何在 Odoo18 视图中添加关联数据看板按钮 | 免费开源ERP实施诀窍

文 / 开源智造 Odoo亚太金牌服务 引言 关联数据看板按钮乃是 Odoo 当中的一项强效功能&#xff0c;它容许用户顺遂地访问相关记录&#xff0c;或者直接从模型的表单视图施行特定操作。它们为用户给予了对重要信息的疾速访问途径&#xff0c;并简化了工作流程&#xff0c;由此…

提升网站流量的关键:AI在SEO关键词优化中的应用

内容概要 在当今数字时代&#xff0c;提升网站流量已成为每个网站管理员的首要任务。而人工智能的技术进步&#xff0c;为搜索引擎优化&#xff08;SEO&#xff09;提供了强有力的支持&#xff0c;尤其是在关键词优化方面。关键词是连接用户需求与网站内容的桥梁&#xff0c;其…

腾讯图标/百并发

腾讯新图标&#xff0c;识别速度7毫秒&#xff0c; 百并发无压力

python和C++中的逻辑与/或、位与/或

在 Python 和 C 中&#xff0c;“与”和“或”的实现逻辑相似&#xff0c;但符号和使用方式有区别。 1.Python 中的与、或 与&#xff08;AND&#xff09;&#xff1a;and或&#xff08;OR&#xff09;&#xff1a;or 1.1 逻辑与、或&#xff1a; 用于布尔值&#xff08;Tr…

PR基本操作

将剪辑添加到序列 1.在项目面板中选择素材&#xff0c;右击插入或覆盖选项&#xff0c;添加的素材依指针所在位置为起点。 上图画框位置会影响素材插入的轨道。 2.直接拖动素材到对应的时间轴轨道即可 3.拖动素材到节目监视器 在此项前插入&#xff1a;在V1轨道当前指针所…