快速求质因子

news/2025/2/14 8:01:09/

快速求质因子

      • 利用线性筛法求解质因子。
      • 小技巧:
      • 时间复杂度分析

题目传送门
首先明确,1不是质数,故质因子中不包含1。

利用线性筛法求解质因子。

bool isPrime[100005] = {0};
int prime[100005] = {0};
int lpf[100005] = {0};
int tot = 0;
int init = [](){memset(isPrime,true,sizeof(isPrime));for(int i = 0;i<100005;i++){lpf[i] = i;}for(int i = 2;i<=100000;i++){if(isPrime[i]){prime[tot++] = i;}for(int j = 0;j<tot && i*prime[j] <= 100000;j++){isPrime[i*prime[j]] = false;lpf[i*prime[j]] = prime[j];if(i%prime[j] == 0)break;}}return 0;
}();

小技巧:

在后续构建并查集时,可以通过索引来构建并查集,nums数组中点的索引作为一个点集,所有(质因子+n)作为一个点集,这样可以避免对1的特判,因为当数组中全为1时,那么对于并查集来说是连通的,但是实际上并不符合题意。
完整代码:

bool isPrime[100005] = {0};
int prime[100005] = {0};
int lpf[100005] = {0};
int tot = 0;
int init = [](){memset(isPrime,true,sizeof(isPrime));for(int i = 0;i<100005;i++){lpf[i] = i;}for(int i = 2;i<=100000;i++){if(isPrime[i]){prime[tot++] = i;}for(int j = 0;j<tot && i*prime[j] <= 100000;j++){isPrime[i*prime[j]] = false;lpf[i*prime[j]] = prime[j];if(i%prime[j] == 0)break;}}return 0;
}();
class Solution {int fa[200005] = {0};int find(int a){if(fa[a] != a){fa[a] = find(fa[a]);}return fa[a];}void merge(int a,int b){int f1 = find(a),f2 = find(b);fa[f1] = f2;}public:bool canTraverseAllPairs(vector<int>& nums) {int n = nums.size();for(int i = 0;i<200005;i++){fa[i] = i;}for(int i = 0;i<n;i++){int val = nums[i];while(val != 1){merge(i,lpf[val]+n);val /= lpf[val];}}for(int i = 0;i<n;i++){//cout<<find(i)<<endl;if(find(i) != find(0)){return false;}}return true;}
};

时间复杂度分析

[1~n]范围内的质数个数为 n l o g ( n ) \frac{n}{log(n)} log(n)n,预处理得到每个数字的最小质因子后, l o g ( n ) log(n) log(n)时间即可得到所有的质因子,那么时间复杂度为 O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))


http://www.ppmy.cn/news/103391.html

相关文章

【AGC】云监控日志服务查询不到Logger日志相关问题

【关键字】 AGC、云监控、日志服务 【问题描述】 开发者反馈在使用AGC云监控&#xff0c;填写了Logger日志&#xff0c;但是在云监控的日志服务查不到的问题。具体如下所述&#xff1a; 云函数按要求写了Logger日志&#xff0c;但是在云监控的日志服务页面查询不到&#xff…

【Vue】笔记一:vue技术栈详解

vue技术栈详解 1. Vue框架2. Vue Router3. Vuex4. Axios5. Element UI6. Nuxt.js7. TypeScript Vue技术栈主要包含Vue框架本身以及一些常用的Vue生态技术&#xff0c;下面一一进行介绍。 1. Vue框架 Vue框架是构建用户界面和单页面应用程序的核心框架&#xff0c;主要提供以下…

Linux:CentOS:进程查看和控制

查看 ps 查看静态的进程统计信息top查看动态的进程排名信息pgrep根据特定条件查询进程 PID 信息pstree以树形结构列出进程信息 S ---休眠 R ---运行 Z ---僵死&#xff08;应予以手动终止&#xff09; < ---高优先级 N ---低优先级 …

智慧物流货运系统源码,网络货运平台系统源码,货运系统开发源码部署

一套结合货主、平台、实际承运人多方业务场景&#xff0c;构建人、车、货、企一体的标准化网络货运平台系统源码。 文末获取联系 平台服务于货主与司机&#xff0c;进行服务对接&#xff0c;为货主节省时间找车&#xff0c;为司机找货获得利润。 货主端&#xff1a;货车主在线发…

【网络协议详解】——电子邮件系统协议(学习笔记)

目录 &#x1f552; 1. 电子邮件系统概述&#x1f552; 2. 简单邮件传送协议SMTP&#x1f552; 3. SMTP协议的命令和响应&#x1f558; 3.1 命令&#x1f564; 3.1.1 HELO&#x1f564; 3.1.2 MAIL FROM&#x1f564; 3.1.3 RCPT TO&#x1f564; 3.1.4 DATA&#x1f564; 3.1.…

客服配置-shopro

客服配置 注意事项 shopro客服系统 采用 workerman 的 gateway-worker 作为服务基础&#xff0c;请先安装 gateway-worker 扩展包shopro商城 已不再支持 workerman 在线客服插件 安装部署 安装扩展包 composer require workerman/gateway-worker:~3.0 删除禁用函数(如有未列…

TCP 和 UDP 在哪些场景下会被使用?

传输层是计算机网络体系结构中的关键层次之一&#xff0c;主要负责向两个主机中的进程之间的通信提供服务。传输层在终端用户之间提供透明的数据传输&#xff0c;向上层提供可靠的数据传输服务。它在给定的链路上通过流量控制、分段/重组和差错控制来保证数据传输的可靠性。传输…

了解JS三种实时通信方式——Eventsource、websocket与socket.io之间的差异和优缺点

Eventsource、websocket与socket.io 三者的差异和优缺点 EventSource EventSource 是一种轻量级的 API&#xff0c;用于获取来自服务器的实时事件。它是 WebSockets 的替代方案&#xff0c;因为它比 WebSockets 更简单&#xff0c;更适合处理服务器向客户端发送数据的情况。使…