算法-数论-蓝桥杯

算法-数论

1、最大公约数

def gcd(a,b):if b == 0:return areturn gcd(b, a%b) # a和b的最大公约数等于b与a mod b 的最大公约数def gcd(a,b):while b != 0:cur = aa = bb = cur%bpassreturn a

欧几里得算法

a可以表示成a = kb + r(a,b,k,r皆为正整数,且r不为0)

假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。

而r = a - kb,两边同时除以d,r/d=a/d-kb/d,由等式右边可知m=r/d为整数,因此d|r

因此d也是b,a mod b的公约数。

因(a,b)和(b,a mod b)的公约数相等,则其最大公约数也相等,得证。

例题:

1、蓝桥杯2019年第十届省赛真题-等差数列 - C语言网 (dotcpp.com)

import math
n=int(input())
arr=list(map(int,input().split()))if arr[0] > arr[1]:max_ = arr[0]min_ = arr[1]
else:max_ = arr[1]min_ = arr[0]
sub = max_ -min_
for i in range(2, n):sub = math.gcd(sub, abs(arr[i]-arr[i-1]))min_ = min(min_, arr[i])max_ = max(max_, arr[i])
if max_ == min_ : print(n)
else:print((max_ - min_) // sub + 1)

2、1223. 最大比例 - AcWing题库

辗转相减法

n = int(input())
arr = list(map(int, input().split()))
arr.sort()def gcd(a,b):if b == 0:return areturn gcd(b, a%b)
top, bot = 0,0
def gcd_sub(a, b):if a < b:a,b = b,aif b==1:return areturn gcd_sub(b, a//b)
i = 1
while i < n:if arr[i] != arr[0]:gcd_ = gcd(arr[i], arr[0])top = arr[i]//gcd_bot = arr[0]//gcd_breaki += 1
if i == n:print(1)
else:for i in range(i, n):gcd_ = gcd(arr[i], arr[0])a = arr[i]//gcd_b = arr[0]//gcd_top = gcd_sub(a, top)bot = gcd_sub(b, bot)print(f'{top}/{bot}')

1.1 扩展欧几里得定律

def ext_euclid(a, b):     if b == 0:         return 1, 0, a     else:         x, y, q = ext_euclid(b, a % b) # q = gcd(a, b) = gcd(b, a%b)         x, y = y, (x - (a // b) * y)         return x, y, q

扩展欧几里得算法求系数x,y_哔哩哔哩_bilibili

image-20240404112117771

例题:1299. 五指山 - AcWing题库
def olai(a, b):if b == 0:return 1,0,ax, y, gcd = olai(b, a%b)x, y = y, x-(a//b)*yreturn x, y, gcddef funt(n, d, x, y):x1, y1, gcd = olai(n, d)if (y-x)%gcd != 0:print('Impossible')else:d = y1*(y-x)//gcdn //= gcd # ax+by = n;   x = x+k*(b/gcd(a,b)); y = y+k*(a/gcd(a,b))print((d%n+n)%n)for _ in range(int(input())):n, d, x, y = map(int, input().split())funt(n, d, x, y)

2、最小公倍数

def funt(a,b):return a*b//gcd(a,b)

最小公倍数 * 最大公约数 == a*b

3、质数筛

def getPrimes(n):is_primes = [True]*(n+1)  # 初始化一个布尔数组,表示从2到n的所有数都是质数primes = [] # 存储质数for i in range(2, int(n**(1/2))+1):if is_primes[i]:primes.append(i)# 将当前质数的所有倍数标记为非质数for j in range(i*i, n+1, i): is_primes[j] = False# 后面的质数的倍数一定会超for i in range(int(n**(1/2))+1, n+1):if is_primes[i]:primes.append(i)return primes

4、区间质数筛

import mathdef simple_sieve(limit):primes = []sieve = [True] * (limit + 1)# 0和1不是质数,所以标记为Falsesieve[0] = sieve[1] = False# 从2到根号limit遍历数字for num in range(2, int(math.sqrt(limit)) + 1):if sieve[num]:primes.append(num)for multiple in range(num * num, limit + 1, num):sieve[multiple] = Falsefor num in range(int(math.sqrt(limit)) + 1, limit + 1):if sieve[num]:primes.append(num)return primesdef segmented_sieve(start, end):# 计算质数的上限limit = int(math.sqrt(end)) + 1primes = simple_sieve(limit)primes_count = len(primes)# 创建一个布尔数组,用于标记区间内的数字是否为质数,初始化为Truesieve = [True] * (end - start + 1)# 对于每一个小于等于根号end的质数for i in range(primes_count):# 计算刚好大于等于start的primes[i]的数base = max(primes[i]*primes[i], ((start + primes[i] - 1) // primes[i]) * primes[i])# 将当前质数的倍数标记为非质数for j in range(base, end + 1, primes[i]):sieve[j - start] = False# 生成区间内的质数列表segmented_primes = [start + i for i in range(end - start + 1) if sieve[i]]return segmented_primesstart = 10
end = 50
segmented_sieve(start, end)

5、欧拉函数

def funt(n):count = np = 2while p*p <= n:# 找到质因子if n % p == 0:while n % p == 0:n //= pcount -= count//p  # n*(1-p)p += 1if n > 1:count -= count//nreturn count
funt(20)

欧拉函数公式证明_哔哩哔哩_bilibili

image-20240403080823201

image-20240403080931568

6、计算质因子个数

def funt(n):count = 0p = 2while p * p <= n:if n % p == 0:count += 1while n % p == 0:n //= pp += 1if n > 1:count += 1return count
funt(12) 

7、计算所有约数个数

约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。

def funt(n):count = 1p = 2while p*p <= n:cnt = 0while n%p == 0:cnt += 1n //= pcount *= (cnt+1)if n>1:count *= 2return count
funt(12)

如12:12可以写成2 ** 2 *3,所以 对于2的选择有3种,幂为0、1、2;3的选择有两种,幂为0、1.

相乘即为约数和

8、计算所有约数和

def funt(n):cnt = 0p = 1while p*p <= n:# 一次算两个约数if n%p == 0:cnt += p# 平方就只用算一次if p*p != n:cnt += n//pp += 1return cnt
funt(12)
例题

1295. X的因子链 - AcWing题库

# 方法一 动规  
def funt(n):primes = [n]p = 2while p*p <= n:if n%p == 0:primes.append(p)if p*p != n:primes.append(n//p)p += 1if n>1 and n != primes[0]:primes.append(n)primes.sort()dp = [[1]*len(primes) for _ in range(2)]for i in range(1, len(primes)):max_ = cnt = 0for j in range(i):if primes[i] % primes[j] == 0:if dp[0][j] > max_:cnt = dp[1][j]max_ = dp[0][j]elif dp[0][j] == max_:cnt += dp[1][j]dp[0][i],dp[1][i] = max_+1, cnt if cnt else 1print(dp[0][-1], dp[1][-1])
while True:try:n = int(input())funt(n)except EOFError:break# 数学!!! https://www.acwing.com/solution/content/97535/ 具体请看题解,我实在不知道怎么表达o(´^`)o
def A(a, b):cnt = 1while b > 0:cnt *= aa -= 1b -= 1return cntdef funt(n):cnt = []p = 2while p*p <= n:if n%p == 0:cnt_ = 0while n%p == 0:cnt_ += 1n //= pcnt.append(cnt_)p += 1if n>1:cnt.append(1)sum_ = sum(cnt)a = 1for i in cnt:if i > 1:a *= A(i,i)times = A(sum_, sum_)//aprint(sum_, times)
while True:try:n = int(input())funt(n)except EOFError:break

9、快速幂

# n为负数则最终结果返回 1/pow(x,-n)
def pow(x, n):if n < 2:return x**nret = pow(x, n//2)if n%2:return ret*ret*xreturn ret*ret
pow(2, 10)

1:
a *= A(i,i)
times = A(sum_, sum_)//a
print(sum_, times)
while True:
try:
n = int(input())
funt(n)
except EOFError:
break

## 9、快速幂```Python
# n为负数则最终结果返回 1/pow(x,-n)
def pow(x, n):if n < 2:return x**nret = pow(x, n//2)if n%2:return ret*ret*xreturn ret*ret
pow(2, 10)

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

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

相关文章

2024最新软件测试八股文,能不能拿心仪Offer就看你背得怎样了

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Linux - mac 装 mutipass 获取 ubuntu

mutipass &#xff1a;https://multipass.run/docs/mac-tutorial mutipass list mutipass launch --name myname mutipass shell myname 获取 root权限&#xff1a; sudo su

生成式人工智能与 LangChain(预览)(上)

原文&#xff1a;Generative AI with LangChain 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 一、生成模型是什么&#xff1f; 人工智能&#xff08;AI&#xff09;取得了重大进展&#xff0c;影响着企业、社会和个人。在过去的十年左右&#xff0c;深度学习已经发…

副业选择攻略:如何找到最适合自己的那一个?

大家好&#xff0c;我是木薯。今天有个新人伙伴来咨询客服&#xff1a;新手适不适合在水牛社上做副业&#xff1f;什么样的副业适合自己&#xff1f; 这种问题其实对我们来说已经见得太多太多了&#xff0c;归其原因是因为自己对副业没有一个清晰的自我认知&#xff0c;从而感觉…

基于LEAP模型的能源环境发展、碳排放建模预测及不确定性分析

在国家“3060”碳达峰碳中和的政策背景下&#xff0c;如何寻求经济-能源-环境的平衡有效发展是国家、省份、城市及园区等不同级别经济体的重要课题。根据国家政策、当地能源结构、能源技术发展水平以及相关碳排放指标制定合理有效的低碳能源发展规划需要以科学准确的能源环境发…

Spring——框架介绍

每一个Java技术中都会存在一个“核心对象”&#xff0c;这个核心对象来完成主要任务为了得到核心对象&#xff0c;需要创建若干个辅助对象&#xff0c;从而导致开发步骤增加JDBC中 JDBC 核心对象——PreparedStatement 通过DriverManager得到数据库厂商提供的Driver对象DriverM…

京东云轻量云主机8核16G配置租用价格1198元1年、4688元三年

京东云轻量云主机8核16G服务器租用优惠价格1198元1年、4688元三年&#xff0c;配置为8C16G-270G SSD系统盘-5M带宽-500G月流量&#xff0c;华北-北京地域。京东云8核16G服务器活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云8核16G服务器优惠价格 京东云…

MySQL数据库基础--存储引擎

MySQL体系结构 连接层 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理&#xff0c;授权认证&#xff0c;及相关的安全方案&#xff0c;服务器也会为安全接入的每个客户端验证他所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功…

【C++入门】缺省参数、函数重载与引用

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

就业班 第二阶段(python) 2401--4.3 day2 python2

七、标准数据类型 1、为什么编程语言中要有类型 类型有以下几个重要角色&#xff1a; 对机器而言&#xff0c;类型描述了内存中的电荷是怎么解释的。 对编译器或者解释器而言&#xff0c;类型可以协助确保上面那些电荷、字节在程序的运行中始终如一地被理解。 对程序员而言…

C++算法 —— 递归

一、汉诺塔问题 1.链接 面试题 08.06. 汉诺塔问题 - 力扣&#xff08;LeetCode&#xff09; 2.描述 3.思路 4.参考代码 class Solution { public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {dfs(A.size(),A,B,C);}void…

Java项目:基于Springboot+vue社区医院管理系统设计与实现(源码+数据库+毕业论文)

一、项目简介 本项目是一套基于Springbootvue社区医院管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能…

百元不入耳蓝牙耳机哪个好?必入五款高性价比产品

喜欢听歌的朋友都会遇到一个常见问题&#xff0c;长时间戴耳机容易导致耳朵不适&#xff0c;甚至疼痛难忍。这种情况下&#xff0c;要是不听音乐反而感到不舒服&#xff0c;真是让人苦恼&#xff0c;仿佛音乐与耳机无法和谐共存。但是&#xff0c;难道就没有一款既舒适又让人心…

【STL】list的底层原理及其实现

文章目录 list的介绍list的整体结构设计list的构造代码模拟实现&#xff1a; list节点类的实现list 迭代器Iterator的使用以及实现Iterator的使用Iterator的底层实现反向迭代器 list与vector的比较实现list类 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列…

4.7学习总结

java学习 一.Stream流 (一.)概念: Stream将要处理的元素集合看作一种流&#xff0c;在流的过程中&#xff0c;借助Stream API对流中的元素进行操作&#xff0c;比如&#xff1a;筛选、排序、聚合等。Stream流是对集合&#xff08;Collection&#xff09;对象功能的增强&…

使用ShardingSphere报错

使用ShardingSphere报错 1604 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near SHOW VARIABLES LIKE sql_mode; SELECT COUNT(*) AS support_ndb FROM information_ at line 1报错…

【STL学习】(4)vector的模拟

前言 本文将模拟实现vector的常用功能&#xff0c;目的在于更深入理解vector。 一、前置知识 在模拟之前先对vector的结构和常用接口学习&#xff0c;有一个大致了解。看源码&#xff0c;本文参考的源码是SGI版本的stl3.0。 技巧&#xff1a; 看源码不要一行一行的看&#xff…

【全套源码教程】基于SpringBoot+MyBatis+Vue的流浪动物救助网站的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架&#xff1a;Spring Boot 持久层框架&#xff1a;MyBatis 前端框架&#xff1a;Vue.js 数据库&#xff1a;MySQL 功能介绍 前台界面功能介绍 动物领养及捐赠 宠物论坛 公告信息 商品页面 寻宠服务 个人中心 购…

全面探究 LangChain Text Splitters

全面探究 LangChain Text Splitters 0. 引言1. 文本拆分器的类型2. 探究各个文本拆分器2-1. Split by HTML header2-2. Split by HTML section2-3. Split by character2-4. Split code2-5. MarkdownHeaderTextSplitter2-6. Recursively split JSON2-7. Recursively split by ch…

力扣---分隔链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&a…