当前位置: 首页 > news >正文

leetcode---素数,最小质因子,最大公约数

1 判断一个数是不是质数(素数)

方法1:依次判断能否被n整除即可,能够整除则不是质数,否则是质数
方法2:假如n是合数,必然存在非1的两个约数p1和p2,其中p1<=sqrt(n),p2>=sqrt(n)。
方法3:等于 6x-1 或者 6x+1,其中 x 是大于等于1的自然数。

2 判断一段素数

2.1 Eratosthenes 筛法 O(Nlog(logN))

Eratosthenes 筛法进行的是打表,也就是平时说的离线操作,当查询量比较大的时候,我们往往采用这种方法进行离线操作处理;该算法的内容是:首先假设 n 个数全部都是素数,然后从 2 开始,把每一个数的倍数都剔除并标记成合数(因为合数肯定是有素因子的),这样列表中保存着的都是没有素因子的数,就是我们想要的质数了。

n = max(2, n)   #处理输入数字为0的情况
is_prime = n * [1] #标记是不是素数
is_prime[0] = is_prime[1] = 0for i in range(2, n): # 从2开始if is_prime[i]:   #如果不是素数for j in range(2, n): # 就标记他的倍数的数字,剔除素数队列if i * j >= n: breakis_prime[i * j] = 0
return sum(is_prime)

比如对数字 6 来说,素因子 2 和 3 在筛选过程中都对他进行了剔除标记,也就是说,所有 6 的倍数,至少都被 2 和 3 进行了重复的剔除。
Eratosthenes 筛法的时间复杂度理论值是 O(Nlog(logN))

2.2 欧拉筛法 - 线性筛 O(N)

我们只对小于等于 sqrt(n) 的数进行取余检查;这里可以采取类似但是更简洁的办法,只要保证每个合数只会被他的最小素因子筛掉就可以了,所以我们优化算法的核心:

寻找并保存当前的素数;
对每个数的从小到大的素数次倍数进行标记,当发现这个数的素因子后停止(这也就保证每个数都是被最小素因子筛掉的);

线性筛的理论复杂度是 O(N)

n = max(2, n)
primes = n * [0]  # 保存已经筛出的素数
cnt = 0           # 记录已经筛出的素数个数
is_prime = n * [1]
is_prime[0] = is_prime[1] = 0
for i in range(2, n):if is_prime[i]: # 保存已经筛出的素数primes[cnt] = icnt += 1for j in range(cnt):# 如越界则停止if primes[j] * i >= n: break # 标记 i 的素数次倍数is_prime[primes[j] * i] = 0# 如遇到 i 的素因数,则停止#这句代码保证了每个数最多被筛一次,将时间复杂度降到了线性。证明如下:if i % primes[j] == 0: break 
return sum(is_prime)

注意到筛法求素数的同时也得到了每个数的最小质因子。

2.3 meissel–lehmer(亚线性时间找出素数个数)

在这里插入图片描述
证明与推理过程

2.4 杜教筛,洲阁筛

3 根据筛法求【筛法可得到最小质因子】

3.1 筛法求欧拉函数

欧拉函数:是小于等于n的正整数中与n互质的数的数目

3.2 筛法求莫比乌斯函数

莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号。(据说,高斯(Gauss)比莫比乌斯早三十年就曾考虑过这个函数)。
具体定义如下:
如果一个数包含平方因子,那么miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。
如果一个数不包含平方因子,并且有k个不同的质因子,那么miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。
给出一个数n, 计算miu(n)。

3.3 筛法求约数个数

3.4 筛法求约数和

4 最大公约数Greatest Common Divisor GCD

4.1 欧几里得算法

求 GCD 在数论中公认的最常用算法即为欧几里得算法,也就是我们在高中时学到的辗转相除法。
欧几里得算法的基本原理用一句话就可以说清楚:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数:gcd(a,b)=gcd(b,a mod b) 。

4.2 扩展欧几里得算法

丢番图方程(Diophantine Equation)
丢番图方程指的是:未知数个数多于方程个数,且未知数只能是整数的整数系数方程或方程组。
例如以下式中, a,b,c 都为整数:
a1*x1b1 + a2*x2b2 + …… + an*xnbn = n

裴蜀定理(Bézout’s identity)
在数论中,裴蜀定理是一个关于最大公约数的定理。这个定理说明了对于任意整数 a、b 和他们的最大公约数 d,关于未知数 x 和 y 的线性丢番图方程:ax+by=m有解,当且仅当 m 是 d 的倍数时。这个等式也被称为裴蜀等式。
裴蜀等式有解时必然有无穷多个整数解,每组解 x 、y 都称之为裴蜀数,可用辗转相除法求得。

辗转相除法实现扩展欧几里得算法
既然说可以用辗转相除法来解决这个问题,那么我们先来说明一下如何通过辗转相除法来求二元一次线性丢番图方程。

辗转相除法过程
以 23x + 17y = 1 为例,我们来求 GCD(23, 17):

23 = 17 * 1 + 6
17 = 6 * 2 + 5
6 = 5 * 1 + 1
5 = 1 * 5 + 0
1 = 0 * 0 + 1

改写成余数形式

将等式右边的第一项移项:
23×1+17×−1=6 (1)
17×1+6×−2=5 (2)
6×1+5×−1=1 (3)

反向带入原式

带下划线的 6 和 5 会使用 (1) 和 (2) 两个式子反向带入,形同换元:
1=6 ×1 + 5 ×(-1)
(1)×1+(2)×−1
(23×1+17×−1)+[17×1+(23×1+17×−1)×−2]×−1
23×3+17×−4
23x+17y

所以反解得,x = 3, y = -4 是上述二元一次线性丢番图方程的一组解。

扩展欧几里得算法证明

5 根据最大公约数求

5.1 根据两个杯子得到指定target的水

5.2 根据两个电容得到指定target的电量

情况一
边界情况,即当 c>max(a,b) ,这种情况是无法使得 A 和 B 的电量达到 c 的。直接输出 0。

情况二
当 a = c 或者 b = c 的时候,只进行一次充电操作就可以完成,直接输出 1。

情况三
接下来我们考虑一般情况,即需要满足以下前提条件:
c<max(a,b)且 c不等于min(a,b)
我们将这个问题换一个思路转化一下假设给出的 a 、b、 c 一定有解,那么我们来设置对 A 做了 x 次的充(放)电,对 B 做了 y 次的充(放)电,并且做了 k 次的操作三。

如果将 A、B 当做一个大电容来看这个电容只有充放电 a 单位、充放电 b 单位这 4 种操作。那么我们就可以列出一个关系式:
ax+by=c由于 a、b 为非负整数,又因为前提条件,则 x 和 y 符号相反。

暂且,我们先不管做了几次操作三,先只考虑充放电问题,那其实就是已知 a、b、c,我们在给定范围内求解 x 和 y 的解就可以了。那么这个问题我们要如何求解呢?这就是扩展欧几里得算法所要解决的问题。

ax+by=gcd(a,b)×k=c

def ex_gcd(a, b):if b == 0:return 1, 0, aelse:x, y, r = ex_gcd(b, a % b) x, y = y, (x - (a // b) * y)return x, y, r

相关文章:

leetcode---素数,最小质因子,最大公约数

1 判断一个数是不是质数(素数) 方法1&#xff1a;依次判断能否被n整除即可&#xff0c;能够整除则不是质数&#xff0c;否则是质数 方法2&#xff1a;假如n是合数&#xff0c;必然存在非1的两个约数p1和p2&#xff0c;其中p1<sqrt(n)&#xff0c;p2>sqrt(n)。 方法3&…...

基于stm32的蓝牙模块实验

蓝牙模块定长或不定长发送 头文件 #include "stdio.h" #include "sys.h"#define UART2_RX_BUF_SIZE 128 #define UART2_TX_BUF_SIZE 64UART_HandleTypeDef uart2_handle;uint8_t uart2_rx_buf[UART2_RX_BUF_SIZE]; uint16_t uart2_rx_len 0; void b…...

C语言解决TopK问题

前言&#xff1a; 本文TopK问题是在数据量很大的前提下进行解决&#xff0c;当数据量足够大时&#xff0c;内存中存不下&#xff0c;只能存到文件硬盘中。当存到硬盘中&#xff0c;我们无法用建堆&#xff0c;一个一个pop取出最值的方式解决&#xff0c;因为我们没法在硬盘中去…...

磁盘存储链式结构——B树与B+树

红黑树处理数据都是在内存中&#xff0c;考虑的都是内存中的运算时间复杂度。如果我们要操作的数据集非常大&#xff0c;大到内存已经没办法处理了该怎么办呢&#xff1f; 试想一下&#xff0c;为了要在一个拥有几十万个文件的磁盘中查找一个文本文件&#xff0c;设计的…...

如何批量从sql语句中提取表名

简介 使用的卢易表 的提取表名功能&#xff0c;可以从sql语句中批量提取表名。采用纯文本sql语法分析&#xff0c;无需连接数据库&#xff0c;支持从含非sql语句的文件文件中提取&#xff0c;支持各类数据库sql语法。 特点 快&#xff1a;从成百个文件中提取上千个表名只需1…...

怎么把音频的速度调慢?6个方法调节音频速度

怎么把音频的速度调慢&#xff1f;调慢音频速度不仅可以帮助我们更好地捕捉细节&#xff0c;还能让我们在分析和学习时更加从容。这对于音乐爱好者来说&#xff0c;尤其有助于理解复杂的旋律和和声&#xff0c;使学习过程变得更加高效。而在语言学习中&#xff0c;放慢语速则能…...

K8s-services+pod详解1

一、Service 我们能够利用Deployment创建一组Pod来提供具有高可用性的服务。 虽然每个Pod都会分配一个单独的Pod IP&#xff0c;然而却存在如下两问题&#xff1a; Pod IP 会随着Pod的重建产生变化Pod IP 仅仅是集群内可见的虚拟IP&#xff0c;外部无法访问 这样对于访问这…...

从RNN讲起(RNN、LSTM、GRU、BiGRU)——序列数据处理网络

文章目录 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;1. 什么是RNN&#xff1f;2. 经典RNN的结构3. RNN的主要特点4. RNN存在问题——长期依赖&#xff08;Long-TermDependencies&#xff09;问题 LSTM&#xff08;Long Short-Term Memory&a…...

python:假的身份信息生成模块faker

前言 发现一个有趣的python模块&#xff08;faker&#xff09;&#xff0c;他支持生成多个国家语言下的假身份信息&#xff0c;包含人名、地址、邮箱、公司名、电话号码、甚至是个人简历&#xff01; 你可以拿它做一些自动化测试&#xff0c;或一些跟假数据有关的填充工作。 代…...

spring task的使用场景

spring task 简介 spring task 是spring自带的任务调度框架按照约定的时间执行某个方法的工具&#xff0c;类似于闹钟 应用场景 cron表达式 周和日两者必定有一个是问号 简单案例...

美畅物联丨剖析 GB/T 28181 与 GB 35114:视频汇聚领域的关键协议

我们在使用畅联云平台进行视频汇聚时&#xff0c;经常会用的GB/T 28181协议&#xff0c;前面我们写了关于GB/T 28181的相关介绍&#xff0c;​ 详见《畅联云平台&#xff5c;关于GB28181你了解多少&#xff1f;》。 ​最近也有朋友向我们咨询GB 35114协议与GB/T 28181有什么不同…...

uni-app 开发的应用快速构建成鸿蒙原生应用

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;它支持编译到 iOS、Android、小程序等多个平台。对于 HarmonyOS&#xff08;鸿蒙系统&#xff09;&#xff0c;uni-app 提供了特定的支持&#xff0c;允许开发者构建鸿蒙原生应用。 一、uni-app 对 HarmonyOS 的支…...

代码随想录算法训练营| 669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树 、 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目 参考文章 思路&#xff1a;这题其实就是删除不符合上下边界的节点。注意&#xff1a;这里删除不符合上下边界节点时&#xff0c;这个不符合上下边界的节点的左或右子树可能存在符合上下边界的节点&#xff0c;所i有每次比较完之后&#xff0c;要继…...

Django模型实现外键自关联

Django模型实现外键自关联 1、场景 省市区、评论 2、模型models.py from django.db import models 资讯评论:资讯,用户,是否取消,时间class CommentInfomation(models.Model):info = models...

Android ViewModel

一问&#xff1a;ViewModel如何保证应用配置变化后能够自动继续存在&#xff0c;其原理是什么&#xff0c;ViewModel的生命周期和谁绑定的? ViewModel 的确能够在应用配置发生变化&#xff08;例如屏幕旋转&#xff09;后继续存在&#xff0c;这得益于 Android 系统的 ViewMod…...

优先算法1--双指针

“一念既出&#xff0c;万山无阻。”加油陌生人&#xff01; 目录 1.双指针--移动零 2.双指针-复写零 ok&#xff0c;首先在学习之前&#xff0c;为了方便大家后面的学习&#xff0c;我们这里需要补充一个知识点&#xff0c;我这里所谓的指针&#xff0c;不是之前学习的带有…...

利用弹性盒子完成移动端布局(第二次实验作业)

需要实现的效果如下&#xff1a; 下面是首先是这个项目的框架&#xff1a; 然后是html页面的代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"wid…...

C# 字符串(string)三个不同的处理方法:IsNullOrEmpty、IsInterned 、IsNullOrWhiteSpace

在C#中&#xff0c;string.IsNullOrEmpty、string.IsInterned 和 string.IsNullOrWhiteSpace 是三个不同的字符串处理方法&#xff0c;它们各自有不同的用途&#xff1a; 1.string.IsNullOrEmpty&#xff1a; 这个方法用来检查字符串是否为null或者空字符串&#xff08;"…...

读书笔记 - 虚拟化技术 - 0 QEMU/KVM概述与历史

《QEMU/KVM源码解析与应用》 - 王强 概述 虚拟化简介 虚拟化思想 David Wheeler&#xff1a;计算机科学中任何问题都可以通过增加一个中间层来解决。 虚拟化思想存在与计算机科学的各个领域。 主要思想&#xff1a;通过分层将底层的复杂&#xff0c;难用的资源虚拟抽象为简…...

常见的负载均衡

1.常见的负载均衡服务 负载均衡服务是分布式系统中用于分配网络流量和请求的关键组件&#xff0c;它可以帮助提高应用程序的可用性、可扩展性和响应速度。以下是一些常用的负载均衡服务&#xff1a; Nginx&#xff1a;一个高性能的Web服务器和反向代理&#xff0c;广泛用于实现…...

OpenClaw技能扩展:基于nanobot开发自定义自动化模块

OpenClaw技能扩展&#xff1a;基于nanobot开发自定义自动化模块 1. 为什么选择nanobot作为技能开发基础 当我第一次尝试为OpenClaw开发自定义技能时&#xff0c;面对庞大的框架和复杂的依赖关系感到无从下手。直到发现nanobot这个轻量级解决方案&#xff0c;才真正找到了适合…...

Linux性能调优实战:CPU与内存优化指南

Linux 性能调优实战指南1. 性能优化基础概念1.1 性能指标Linux性能优化的两个核心指标是吞吐量和延迟。从应用负载角度看&#xff0c;直接影响终端用户体验&#xff1b;从系统资源角度看&#xff0c;关注资源使用率和饱和度。性能问题的本质是系统资源已达瓶颈但请求处理不够快…...

从随机采样到精准决策:蒙特卡罗方法在复杂系统建模中的实践

1. 蒙特卡罗方法&#xff1a;用随机性破解复杂世界的密码 想象你是一位古代数学家&#xff0c;手里只有一把沙子和一块画着方格的石板。现在要计算一个不规则形状的湖泊面积&#xff0c;你会怎么做&#xff1f;最原始的方法可能是把沙子均匀撒在石板上&#xff0c;然后数出落在…...

FanControl:颠覆式开源风扇控制工具的全方位应用指南

FanControl&#xff1a;颠覆式开源风扇控制工具的全方位应用指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…...

医疗陪护管理系统:信息化管理在医院的应用

博主介绍&#xff1a; 所有项目都配有从入门到精通的安装教程&#xff0c;可二开&#xff0c;提供核心代码讲解&#xff0c;项目指导。 项目配有对应开发文档、解析等 项目都录了发布和功能操作演示视频&#xff1b; 项目的界面和功能都可以定制&#xff0c;包安装运行&#xf…...

效率提升:基于快马平台快速集成openclaw开发局域网协作工具

最近在团队协作开发中遇到了一个痛点&#xff1a;每次新成员加入局域网时&#xff0c;都需要手动配置设备信息才能互相访问&#xff0c;文件共享和实时沟通也依赖第三方工具&#xff0c;效率很低。于是尝试用openclaw结合InsCode(快马)平台快速搭建了一套本地化协作工具&#x…...

RGBLEDBlender:嵌入式RGB LED色彩混合与动态控制框架

1. RGBLEDBlender 库深度解析&#xff1a;面向嵌入式系统的 RGB 色彩混合与动态控制框架RGBLEDBlender 是一个轻量级、面向硬件的 RGB LED 色彩混合库&#xff0c;专为资源受限的微控制器平台&#xff08;尤其是 Arduino 生态&#xff09;设计。该库由 Erik Sikich 于 2016 年 …...

嵌入式pRNG:基于WDT与LFSR的轻量级硬件熵随机数生成器

1. pRNG库概述&#xff1a;面向嵌入式系统的轻量级熵收集型伪随机数生成器pRNG&#xff08;Pseudo-Random Number Generator&#xff09;是一个专为资源受限微控制器设计的开源伪随机数生成库&#xff0c;其核心设计哲学是在极小内存开销下&#xff0c;通过硬件时序抖动提取物理…...

YOLOv8目标检测新玩法:用VMamba替换C2f模块,我在DDSM医疗数据集上mAP涨到了0.724

YOLOv8与VMamba融合&#xff1a;医疗影像目标检测的突破实践 在医疗影像分析领域&#xff0c;目标检测技术正经历着从传统卷积神经网络到新型架构的转变。最近&#xff0c;我们将YOLOv8模型中的C2f模块替换为VMamba模块&#xff0c;在DDSM乳腺X光数据集上取得了mAP 0.724的显著…...

别再死记硬背公式了!Cesium中Entity姿态(HPR)的获取与设置,一个例子讲透

Cesium中Entity姿态控制的本质&#xff1a;从HPR到四元数的思维跃迁 当你第一次在Cesium中加载一个3D模型&#xff0c;却发现它头朝下或者背对镜头时&#xff0c;那种挫败感我深有体会。传统教程往往直接扔给你一堆转换公式&#xff0c;却很少解释为什么需要这些看似复杂的数学…...