天秀洛谷专题 - 素数筛

素数筛

Almost Prime

Almost Prime

#include<bits/stdc++.h>
using namespace std;const int N = 3000;
vector<bool> is_prime(N+1, true);
vector<int> primes;// 线性筛生成所有小于N的质数
void sieve() {is_prime[0] = is_prime[1] = false; // 0和1不是质数for (int i = 2; i <= N; ++i) {if (is_prime[i]) {primes.push_back(i);for (int j = 2*i; j <= N; j += i) {is_prime[j] = false;}}}
}int countAlmostPrimes(int n) {sieve(); // 生成质数int count = 0;for (int i = 1; i <= n; ++i) {int temp = i;int distinctPrimeFactors = 0;// 计算i的不同质因子数量for (int j = 0; j < primes.size() && primes[j] * primes[j] <= temp; ++j) {if (temp % primes[j] == 0) {distinctPrimeFactors++;while (temp % primes[j] == 0) temp /= primes[j];}}if (temp > 1) distinctPrimeFactors++; // 处理剩余的大于sqrt(i)的质因子if (distinctPrimeFactors == 2) count++; // 如果恰好有两个不同的质因子}return count;
}int main() {int n;cin >> n;cout << countAlmostPrimes(n) << endl;return 0;
}
if (temp > 1) distinctPrimeFactors++; // 处理剩余的大于sqrt(i)的质因子

这句代码的作用是处理那些在遍历质数并尝试除以它们时剩余的、未被完全除尽的质因子。具体来说,在检查一个数i的质因子时,通常的做法是遍历小于等于sqrt(i)的所有质数,因为一个合数必有一个不大于它的平方根的质因子。

在这个过程中,对于每一个遍历到的质数p,如果i可以被p整除,我们就把i除以p,直到i不能再被p整除。这样做的目的是找出i的所有质因子,并计算它有多少个不同的质因子。

但是,在遍历完所有小于等于sqrt(i)的质数后,可能还剩下一个大于sqrt(i)的质因子。例如,假设i = 2 * 7 * 13,当我们遍历到7并除以7之后,剩下的数是13,它大于sqrt(i)。在这种情况下,我们需要增加distinctPrimeFactors的计数,以确保计算的质因子数量是正确的。

这句话的逻辑是:

  • 如果在完成上述遍历后temp大于1,这意味着i除以它的所有小于等于sqrt(i)的质因子后,还剩下一个大于sqrt(i)的质因子。这个剩余的temp本身就是一个质因子,因为如果它是合数,它就会在之前的遍历中被除尽。
  • 因此,我们需要把这个剩余的质因子计入总的不同质因子数量中,即通过distinctPrimeFactors++来实现。

这个步骤对于确保当一个数具有大于sqrt(i)的质因子时能够正确计算其质因子总数是必需的。

[ARC017A] 素数、コンテスト、素数

[ARC017A] 素数、コンテスト、素数

//日本题目记得答案要输出换行
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
vector<bool> is_primes(N+1,true);
vector<int> primes;void linesieve(){is_primes[0] = is_primes[1] = false;for(int i=2; i<=N; i++){if(is_primes[i]){primes.push_back(i);}for(int j=0; j < primes.size() && i * primes[j] <= N; ++j){is_primes[i * primes[j]] = false;if(i % primes[j] == 0) break;}}
}
bool isprime(int n){if(n<=1) return false;for(int i=2; i * i <=n; i++){if(n % i == 0){return false;}}return true;
}
int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;cin>>n;linesieve();if(is_primes[n]){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}}

[ARC044A] 素数判定

[ARC044A] 素数判定

超时代码展示:

#include<bits/stdc++.h>
using namespace std;
bool is_Prime(int n){if(n==1) return false;for(int i=2;i<=sqrt(n);i++){if(n%i==0) return false;}return true;
}
bool is_HuiWen(int n){string s=to_string(n);int len=s.size();for(int i=0;i<len/2;i++){if(s[i]!=s[len-i-1]) return false;}return true;}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int l,r;cin>>l>>r;for(int i=l;i<=r;i++){if(is_HuiWen(i)&&is_Prime(i)){cout<<i<<endl;}}return 0;
}

要分析这段代码的时间复杂度,我们需要逐个看每个函数和主循环。

  1. is_Prime 函数: 这个函数检查一个数是否为质数。它做了一个从2遍历到sqrt(n)的循环。因此,is_Prime函数的时间复杂度为O(sqrt(n))。

  2. is_HuiWen 函数: 这个函数检查一个数n是否为回文数。它首先转换这个数为字符串,然后检查字符串是否为回文。由于字符串的长度是数字n的位数D(D = log10(n)),这个函数的循环会运行D/2次。因此,is_HuiWen函数的时间复杂度为O(D) = O(log(n))。

  3. 主循环: 主循环遍历从l到r的所有数,对每个数i调用is_HuiWenis_Prime函数。如果r-l=N,那么主循环将执行N次。因此,主循环的时间复杂度是N乘以这两个函数时间复杂度的和。

综上所述,主循环的时间复杂度为O(N * (sqrt(n) + log(n)))。因为sqrt(n)在大数范围内增长速度快于log(n),所以整体时间复杂度主要受sqrt(n)的影响,我们可以近似表示为O(N*sqrt(n))。

然而,这里的n是循环中的当前数字i,它在l到r之间变化。如果我们考虑最坏情况(即r是最大值),整体时间复杂度可以进一步概括为O(N*sqrt®)。这里的N是数字的范围(r-l+1),r是范围内的最大值。

正确思路展示

为了解决这个问题,我们可以使用线性筛(也称为埃拉托斯特尼筛法的优化版本)来高效地生成范围内的所有质数,然后从这些质数中筛选出回文数。线性筛的好处在于它对每个合数只进行一次筛选,时间复杂度为O(n),这使得它非常适合用于处理大范围内的质数筛选问题。

接下来,我们按照以下步骤进行:

  1. 使用线性筛生成小于或等于一亿的所有质数。
  2. 遍历这些质数,检查它们是否是回文数。
  3. 如果一个质数是回文数,且在给定的区间内,则输出这个数。

线性筛法改进代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 100000000;
vector<int> primes;
vector<bool> prime(MAXN + 1, true);void linearSieve() {prime[0] = prime[1] = false;for (int i = 2; i <= MAXN; i++) {if (prime[i]) {primes.push_back(i);}for (size_t j = 0; j < primes.size() && i * primes[j] <= MAXN; j++) {prime[i * primes[j]] = false;if (i % primes[j] == 0) break;}}
}bool isPalindrome(int n) {string s = to_string(n);string rev_s = s;reverse(rev_s.begin(), rev_s.end());return s == rev_s;
}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int a, b;cin >> a >> b;linearSieve();for (int i = 0; i < primes.size() && primes[i] <= b; i++) {if (primes[i] >= a && isPalindrome(primes[i])) {cout << primes[i] << endl;}}return 0;
}

这段代码首先利用线性筛法预先计算并存储所有小于等于一亿的质数,然后通过简单地遍历这些质数并检查它们是否为回文数来解决原问题。

由于这种方法预计算了所有需要的质数,它能显著减少在给定区间内检查每个数是否为质数的需要,特别是对于大范围数据来说,这种方法能大幅提高效率。

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

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

相关文章

数据结构作业整理:扩展字符

题目展示&#xff1a; 【问题描述】 从键盘输入包含扩展符-的字符串&#xff0c;将其扩展为等价的完整字符&#xff0c;例如将a-d扩展为abcd&#xff0c;并输出扩展后的字符串。 要求&#xff1a;只处理[a-z]、[A-Z]、[0-9]范围内的字符扩展&#xff0c;即只有当扩展符前后的字…

5、Jenkins持续集成-Maven和Tomcat的安装与配置

文章目录 一、Maven的安装与配置1、安装maven并配置环境2、全局工具配置关联jdk和maven3、添加Jenkins全局变量4、修改settings.xml文件5、测试是否配置成功二、Tomcat的安装与配置1、安装tomcat8+2、配置Tomcat用户角色权限3、测试是否配置成功一、Maven的安装与配置 在Jenki…

安全点安全区的通俗理解

想象一下&#xff0c;JVM&#xff08;Java虚拟机&#xff09;是一个忙碌的工厂&#xff0c;而Java程序中的线程就像是工厂里的工人。在这个工厂中&#xff0c;有时需要进行一些大规模的清理工作&#xff0c;比如垃圾回收&#xff0c;来确保工厂运行得更加高效。但是&#xff0c…

Facebook是什么?有什么功能?如何利用Facebook运营?

Facebook&#xff0c;也常被人们称为“脸书”、“脸谱”等&#xff0c;是美国的社交网络服务及社会化媒体网站&#xff0c;拥有超过20亿的月活跃用户&#xff0c;对于众多商家而言&#xff0c;Facebook以其广泛的用户基础和强大的社交影响力&#xff0c;成为了一个理想的社媒营…

Qt源码分析:QMetaObject实现原理

Qt基于QMetaObject实现了信号/槽机制、属性机制等多个功能特性&#xff0c;而QMetaObject实际上是实现了一种反射机制。 Ref. from Reflection in Java The term "RTTI" is a C-specific term referring to the functionality of the core language that allows the…

视频推拉流EasyDSS点播平台云端录像播放异常的问题排查与解决

视频推拉流EasyDSS视频直播点播平台可提供一站式的视频转码、点播、直播、视频推拉流、播放H.265视频等服务&#xff0c;搭配RTMP高清摄像头使用&#xff0c;可将无人机设备的实时流推送到平台上&#xff0c;实现无人机视频推流直播、巡检等应用。 有用户反馈&#xff0c;项目现…

iOS苹果APP签名更新包与已安装应用的签名不一致的原因及解决方法

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01; iOS苹果APP签名更新包与已安装应用的签名不一致可能出现的原因主要有以下几点&#xff0c;同时给出相应的解决方法&#xff1a; 原因&#xff1a; 1.开发者证书不一致&#xff1a; 更新包使用了与之前应用…

2.7、创建列表(List)

概述 列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、…

LeetCode 面试经典150题 392.判断子序列

题目&#xff1a; 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"…

基于深度学习的OCR,如何解决图像像素差的问题?

基于深度学习的OCR技术在处理图像像素差的问题时确实面临一定的挑战。图像像素差可能导致OCR系统无法准确识别文本&#xff0c;从而影响其精度和可靠性。尽管已经有一些方法如SRN-Deblur、超分SR和GAN系列被尝试用于解决这个问题&#xff0c;但效果并不理想。然而&#xff0c;这…

安防监控视频汇聚平台EasyCVR在银河麒麟V10系统中的启动异常及解决方法

安防监控视频平台EasyCVR具备较强的兼容性&#xff0c;它可以支持国标GB28181、RTSP/Onvif、RTMP&#xff0c;以及厂家的私有协议与SDK&#xff0c;如&#xff1a;海康ehome、海康sdk、大华sdk、宇视sdk、华为sdk、萤石云sdk、乐橙sdk等。平台兼容性强&#xff0c;支持Windows系…

BVH2SMPL 实战笔记

目录 渲染npy 初始化smpl模型: 骨骼运动转motion motion结构: BVH2SMPL-main 渲染npy rendering.py self.npy_path = npy_pathself.motions = np.load(self.npy_path)self.rot2xyz = Rotation2xy

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

介绍 将容器化应用程序部署到 Kubernetes 集群时&#xff0c;由于从 registry 中提取必要的容器镜像需要时间&#xff0c;因此可能会出现延迟。在应用程序需要横向扩展或处理高速实时数据的情况下&#xff0c;这种延迟尤其容易造成问题。幸运的是&#xff0c;有几种工具和策略…

爬虫工作量由小到大的思维转变---<第五十七章 Scrapy 降维挖掘---中间件系列(6)>

前言: 继续上一篇:https://hsnd-91.blog.csdn.net/article/details/136978761 我们继续将探讨Scrapy框架中的三个重要中间件&#xff1a;HTTP压缩中间件、重定向中间件和Cookie中间件。 首先&#xff0c;HTTP压缩中间件&#xff08;HttpCompressionMiddleware&#xff09;能…

政安晨:【TensorFlow与Keras实战演绎机器学习】专栏 —— 目录

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras实战演绎机器学习 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 本篇是作者政安晨的专栏《TensorFlow与Keras…

获取CPLEX求解MIP时添加的cutting planes (C program)

源代码&#xff1a;https://www.ibm.com/support/pages/sample-c-program-retrieve-cuts-added-cplex-during-mip-optimization 通过macOS的终端&#xff08;terminal&#xff09;编译&#xff1a; CPX_PATH /Applications/CPLEX_Studio_Community2211/cplex/ CC g ARCH x…

文献阅读笔记(Transformer)

文献阅读笔记&#xff08;Transformer&#xff09; 摘要Abstract1、文献阅读1.1 文献题目1.2 文献摘要1.3 研究背景1.4 模型架构1.4.1 Encoder-Decoder1.4.2 注意力机制1.4.3 多头注意力1.4.4 Position-wise Feed-Forward Networks1.4.5 Embeddings and Softmax1.4.6 Positiona…

重构文件上传行为

目标&#xff1a;将 [前端 → 后端] 改成 [前端 → 中间层 → 后端] 第一步&#xff1a;自定义上传行为&#xff08;ElementPlus&#xff09; <template><el-uploadaction""show-file-listv-model:file-list"fileList":on-change"handleCha…

UnoCSS实现背景图片样式加载

UnoCSS是一个好东西&#xff0c;可以把任何style样式通过css去描述。但是默认使用的tailwindcss有一个不完美&#xff0c;就是当使用图片时&#xff0c;背景图片无法通过原子化css直接描述。例如有一个背景图片&#xff0c;则必须为该图片单独出一个css样式&#xff0c;然后再加…

大小端字节序和字节序的判断+有符号整形和无符号整形的取值范围

大小端存在的意义 大小端字节存储方式&#xff08;Big-Endian 和 Little-Endian&#xff09;的存在主要是由于不同计算机体系结构和网络通信标准对数据表示方式的差异所导致的。大小端字节存储方式的存在具有以下意义&#xff1a; 1. 兼容性&#xff1a;不同的计算机系统和网络…