xtu oj 1618 素数个数

news2024/12/23 23:17:48

文章目录

  • 前言
  • 代码
  • 思路

前言

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

代码

#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=3
	for(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.coloradmin.cn/o/2257772.html

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

相关文章

DAY3 构造函数

构造函数使用代码&#xff1a; #include <iostream> using namespace std; class Rec {const int length;int width; public:Rec():length(10){cout << "Rec无参构造函数" << endl;};Rec(int a,int b):length(a),width(b){cout << "Re…

分布式搜索引擎之elasticsearch基本使用2

分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中&#xff0c;我们已经导入了大量数据到elasticsearch中&#xff0c;实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来&#xff0c;我们研究下…

javaScript交互补充

1、元素的三大系列 1.1、offset系列 1.1.1、offset初相识 使用offset系列相关属性可以动态的得到该元素的位置&#xff08;偏移&#xff09;、大小等 ●获得元素距离带有定位祖先元素的位置 ●获得元素自身的大小&#xff08;宽度高度&#xff09; ●注意&#xff1a;返回的…

【49】AndroidStudio构建其他人开发的Android项目

(1)做Android软件开发&#xff0c;通常会看一些其他人开发的项目源码&#xff0c;当将这些项目的源码通过git clone到本地之后&#xff0c;用AndroidStudio进行打开时&#xff0c;通常会遇到一些环境配置的问题。本文即用来记录在构建他人开发项目源代码这一过程中遇到的一些常…

LLama系列模型简要概述

LLama-1&#xff08;7B, 13B, 33B, 65B参数量&#xff1b;1.4T tokens训练数据量&#xff09; 要做真正Open的AI Efficient&#xff1a;同等预算下&#xff0c;增大训练数据&#xff0c;比增大模型参数量&#xff0c;效果要更好 训练数据&#xff1a; 书、Wiki这种量少、质量高…

22. Three.js案例-创建旋转的圆环面

22. Three.js案例-创建旋转的圆环面 实现效果 知识点 WebGLRenderer (WebGL渲染器) THREE.WebGLRenderer 是Three.js中最常用的渲染器&#xff0c;用于将场景渲染到WebGL画布上。 构造器 new THREE.WebGLRenderer(parameters) 参数类型描述parametersObject可选参数对象&…

Burp(5)web网页端抓包与app渗透测试

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&…

bsp是板级支持包

里面有很多的针对该型号的板子的函数&#xff0c;可以直接调用&#xff0c;也可以直接在里面。 也可以在vivado的sdk上&#xff0c;看到很多相关文档和寄存器偏移等等。

基于智能合约的医院凭证共享中心路径探析

一、引言 随着医疗行业的不断发展和信息技术的进步&#xff0c;基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代&#xff0c;医疗领域面临着诸多挑战&#xff0c;如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…

实验14 RNN的记忆能力和梯度爆炸实验

一 循环神经网络的记忆能力 1.数据集构建 创建了一个DigitSumDataset 类&#xff0c;包括初始化函数init、数据生成函数 generate_data、数据加载函数 load_data、__len__ 方法、__getitem__ 方法。 init函数&#xff1a;接受的参数是data_path&#xff08; 存放数据集的目录…

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

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

IEEE T-RO 软体机器人手指状态估计实现两栖触觉传感

摘要&#xff1a;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队近期在IEEE T-RO上发表了关于软体机器人手指在两栖环境中本体感知方法的论文。 近日&#xff0c;南方科技大学戴建生院士、林间院士、万芳老师、宋超阳老师团队在机器人顶刊IEEE T-RO上以《Propri…

java类静态初始化死锁问题

问题 前端时间帮同事分析了一个IO线程阻塞问题&#xff0c;该问题导致服务端无法处理任何请求&#xff0c;只能进行重启解决&#xff1b;事发时运维dump了下栈信息&#xff0c;堆栈信息如下图&#xff1a; 从上面可以看到io线程都阻塞于Object.wait()&#xff0c;具体是执行Cl…

厦门凯酷全科技有限公司怎么样?

随着短视频和直播带货的兴起&#xff0c;抖音电商平台迅速崛起&#xff0c;成为众多品牌和商家争夺的新战场。在这个竞争激烈的市场中&#xff0c;如何抓住机遇、实现销售增长&#xff0c;成为了每个企业面临的挑战。厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全”&…

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

在Windows和Ubuntu上安装SDKMAN

文章目录 1. SDKMAN概述2. 安装与使用SDKMAN2.1 在Windows上安装SDKMAN2.1.1 安装Git for Windows2.1.2 安装SDKMAN 2.2 利用SDKMAN管理Java2.2.1 查看所有可用的OpenJDK发行版2.2.2 安装Java2.2.3 查看Java版本2.2.4 shell指定使用某个Java版本 2.3 在Ubuntu上安装SDKMAN2.3.1…

1210 作业

思维导图 作业 使用read和write函数拷贝文件&#xff0c;一半拷进一个文件&#xff0c;另一半拷进另一个文件 #include <myhead.h> int main(int argc, const char *argv[]) {int fd1 open("./z1.txt",O_RDONLY);if(fd1-1){perror("open");return…

牛客网热门Java面试题及答案整理(2024最新版)

当今互联网行业中&#xff0c;Java 作为一种广泛应用的编程语言&#xff0c;对于求职者来说仍是一项受欢迎的技能。然而&#xff0c;随着市场上的开发人员数量越来越多&#xff0c;Java 面试的竞争也愈加激烈。 目前 Java 面试有着以下现状&#xff1a; 面试难度加大与过去相…

【SSH+X11】VsCode使用Remote-SSH在远程服务器的docker中打开Rviz

&#x1f680;今天来分享一下通过VsCode的Remote-SSH插件在远程服务器的docker中打开Rviz进行可视化的方法。 具体流程如下图所示&#xff0c;在操作开始前&#xff0c;请先重启设备&#xff0c;排除之前运行配置的影响&#xff1a; ⭐️ 我这里是使用主机连接服务器&#xff…

iPhone 17 Air基本确认,3个大动作

近段时间&#xff0c;果粉圈都在讨论一个尚未发布的新品&#xff1a;iPhone 17 Air&#xff0c;苹果又要来整新活了。 从供应链消息来看&#xff0c;iPhone 17 Air本质上是Plus的替代品&#xff0c;主要是在维持“大屏”这一卖点的同时&#xff0c;增加了“轻薄”属性&#xff…