算法-数论-蓝桥杯

news2024/11/29 12:37:14

算法-数论

1、最大公约数

def gcd(a,b):
    if b == 0:
        return a
    return gcd(b, a%b) # a和b的最大公约数等于b与a mod b 的最大公约数

def gcd(a,b):
    while b != 0:
        cur = a
        a = b
        b = cur%b
        pass
    return 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 a
    return gcd(b, a%b)
top, bot = 0,0
def gcd_sub(a, b):
    if a < b:
        a,b = b,a
    if b==1:
        return a
    return 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_
        break
    i += 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,a
    x, y, gcd = olai(b, a%b)
    x, y = y, x-(a//b)*y
    return x, y, gcd
    
    
def funt(n, d, x, y):
    x1, y1, gcd = olai(n, d)
    if (y-x)%gcd != 0:
        print('Impossible')
    else:
        d = y1*(y-x)//gcd
        n //= 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 math

def simple_sieve(limit):
    primes = []
    sieve = [True] * (limit + 1)
    # 0和1不是质数,所以标记为False
    sieve[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] = False

    for num in range(int(math.sqrt(limit)) + 1, limit + 1):
        if sieve[num]:
            primes.append(num)

    return primes

def segmented_sieve(start, end):
    # 计算质数的上限
    limit = int(math.sqrt(end)) + 1
    primes = simple_sieve(limit)
    primes_count = len(primes)
    # 创建一个布尔数组,用于标记区间内的数字是否为质数,初始化为True
    sieve = [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_primes

start = 10
end = 50
segmented_sieve(start, end)

5、欧拉函数

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

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

image-20240403080823201

image-20240403080931568

6、计算质因子个数

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

7、计算所有约数个数

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

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

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

相乘即为约数和

8、计算所有约数和

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

1295. X的因子链 - AcWing题库

# 方法一 动规  
def funt(n):
    primes = [n]
    p = 2
    while p*p <= n:
        if n%p == 0:
            primes.append(p)
            if p*p != n:
                primes.append(n//p)
        p += 1
    if 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 = 0
        for 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 1

    print(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 = 1
    while b > 0:
        cnt *= a
        a -= 1
        b -= 1
    return cnt

def funt(n):
    cnt = []
    p = 2
    while p*p <= n:
        if n%p == 0:
            cnt_ = 0
            while n%p == 0:
                cnt_ += 1
                n //= p
            cnt.append(cnt_)
        p += 1
    if n>1:
        cnt.append(1)
    sum_ = sum(cnt)

    a = 1
    for i in cnt:
        if i > 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、快速幂

# n为负数则最终结果返回 1/pow(x,-n)
def pow(x, n):
    if n < 2:
        return x**n
    ret = pow(x, n//2)
    if n%2:
        return ret*ret*x
    return 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**n
    ret = pow(x, n//2)
    if n%2:
        return ret*ret*x
    return ret*ret
pow(2, 10)

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

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

相关文章

13 Python进阶:pip及其他常用模块

pip 是 Python 包管理工具&#xff0c;它提供了对 Python 包的查找、下载、安装、卸载的功能。 包地址&#xff1a; https://pypi.org/ 最新的 Python 版本已经预装了 pip。 pip 各种命令 查看是否已经安装 pip 可以使用以下命令&#xff1a; pip --version下载安装包使用…

Mysql底层原理十一:Mvcc

为什么要mvcc&#xff1f; 提高并发度&#xff0c;如果读和写都是通过加锁的方式&#xff0c;并发肯定上不来&#xff0c;通过mvcc来实现写通过加锁&#xff0c;读通过mvcc readView机制 3.9.1 Undo版本链 再重复一遍&#xff0c;页面中的记录存放在用户表空间的数据页中&a…

并发编程之Java中Selector

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Selector提供选择执…

【Web】CTFSHOW-2023CISCN国赛初赛刷题记录(全)

目录 Unzip BackendService go_session deserbug 主打一个精简 Unzip 进来先是一个文件上传界面 右键查看源码&#xff0c;actionupload.php 直接访问/upload.php&#xff0c;看到后端的源码 就是上传一个压缩包&#xff0c;对其进行解包处理 因为其是在/tmp下执行…

MySQL redo log和binlog的区别

redo log和binlog的区别 Redo Log&#xff08;重做日志&#xff09;&#xff1a; 作用&#xff1a; Redo Log是InnoDB存储引擎特有的一种日志&#xff0c;用于确保数据库的事务持久性和恢复能力。 特点&#xff1a; 存储在InnoDB的数据文件中&#xff0c;而不是作为单独的日志…

CICD流水线 发布应用到docker镜像仓库

准备工作 1.先注册免费的镜像仓库 复制链接: https://cr.console.aliyun.com/cn-beijing/instances 实施 1. 新建流水线&#xff0c;选择模板 2.添加流水线源&#xff0c;及是你的代码仓库, 选择对应分支. 3.代码检查以及单元测试&#xff0c;这个步骤可以不用动它. 4. …

【C++】继承总结

一、前言 我们众所周知的C三大特性分别为&#xff1a;封装、继承、多态。 封装就是将接口实现统一化&#xff0c;隐藏那些不同的地方&#xff0c;在上层函数调用体现的方式一样&#xff0c;如各种容器的迭代器iterator&#xff0c;尽管底层实现的方式不同&#xff0c;但是在使用…

Java学习笔记23(面向对象三大特征)

1.5 多态 ​ *多态(polymorphic) ​ *方法或对象具有多种形态&#xff0c;是面向对象的第三大特征&#xff0c;多态是建立在封装和继承基础之上的 1.多态的具体体现 1.方法的多态 &#xff08;重写和重载体现了多态&#xff09; 2.对象的多态 ​ 1.一个对象的编译类型和…

亮数据----教你轻松获取数据

文章目录 1. 数据采集遇到的瓶颈1.1 不会造数据&#xff1f;1.2 不会写爬虫代码&#xff1f; 2.IP 代理基础知识2.1 基本概念2.2 作用和分类2.3 IP 代理的配置和使用2.4 安全和合规 3. 为何使用亮数据 IP 代理3.1 拥有丰富的代理网络服务3.2 简单易操作的采集工具3.3 拥有各平台…

爬虫入狱笔记——xx政府网站公开政策数据

最近在学习爬虫&#xff0c;做个笔记吧 今天爬xx政府网站-政策法规栏目的数据 咱们首先需要找到数据从哪里来&#xff0c;鼠标右键->检查&#xff08;或者快捷键一般为F12&#xff09;检查元素&#xff0c;搜索关键词 eg.【违法案例】 回车&#xff0c; 如果没有的话&am…

「媒体邀约」天津媒体邀约资源有哪些?媒体宣传现场报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 天津作为中国北方的重要城市&#xff0c;拥有丰富的媒体资源&#xff0c;可以为各类活动提供全面的媒体宣传和现场报道。以下是天津地区的媒体邀约资源&#xff1a; 1. 报纸媒体 - 《天…

「38」LUT在直播间调色的高级应用……

「38」LUT滤镜 对人或物进行精进调色 OBS软件中的LUT&#xff08;Look Up Table&#xff09;滤镜&#xff0c;可用于调整视频、图像的色彩和对比度等效果&#xff0c;以实现专业级的颜色调整需求。 左图为原图 右图为LUT 先对比上面的两张图&#xff0c;用了滤镜效果的变化…

【问题处理】银河麒麟操作系统实例分享,银河麒麟高级服务器操作系统mellanox 网卡驱动编译

1.Mellanox 网卡源码驱动下载链接&#xff1a; https://www.mellanox.com/downloads/ofed/MLNX_EN-5.7-1.0.2.0/MLNX_EN_SRC-5.7-1.0.2.0.tgz 2.系统及内核版本如下截图&#xff1a; 3.未升级前 mellanox 网卡驱动版本如下&#xff1a; 4.解压 “MLNX_EN_SRC-5.7-1.0.2.0.tg…

基于单片机电动自行车太阳能充电系统设计

**单片机设计介绍&#xff0c;基于单片机电动自行车太阳能充电系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的电动自行车太阳能充电系统设计&#xff0c;是一个将太阳能技术与电动自行车充电技术相结合的创…

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0&#xff0c;参考上一篇文章: L…

微信小程序实现滚动标签

使用scroll-view标签可实现组件滚动标签 1、list中 list.wxml代码如下: <!--pages/list/list.wxml--> <navigation-bartitle"小程序" back"{{false}}"color"black" background"#FFF"></navigation-bar><scroll-…

「媒体宣传」科技IT行业有哪些媒体邀约资源-51媒体网

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 科技IT行业的媒体邀约资源非常丰富&#xff0c;包括了各种类型的传统媒体和新兴的网络媒体平台。以下是一些主要的媒体邀约资源&#xff1a; 除此之外&#xff0c;还有一些其他科技类网络…

finebi6.0中我的分析中...中加自己的菜单

js的两个扩展点是&#xff1a; BI.config("bi.result_wrapper", function (e) {return e.showMerge !0, e}),BI.config("bi.analysis.admin_list", function (e) {return e.showMergeUser !0, e}) 对应的组件在conf.min.js中的 bi.search_sort 点击事件…

【多线程】Callable详解

Callable接口 先看看Callable接口的源码: Callable是一个函数式接口&#xff0c;此时就可以用lambda表达式更简洁地使用它。Callable是个泛型接口&#xff0c;只有一个方法call&#xff0c;该方法返回类型就是传递进来的V类型。call方法还支持抛出异常. 与Callable对应的是Ru…

「媒体宣传」产业金融财经媒体邀约资源有哪些-51媒体

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 产业金融财经领域的媒体邀约资源涵盖了多种平台和形式&#xff0c;主要包括以下几类&#xff1a; 杂志和报纸&#xff1a;如《中国经济周刊》和《中国证券报》&#xff0c;它们通常报道财…