算法-数论-蓝桥杯

算法-数论

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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论大数据服务化发展史

文章目录 引言正文单一指令阶段脚本化阶段用户界面操作阶段大模型AIOPS阶段总结 引言 一直想写一篇服务化相关的文章&#xff0c;那就别犹豫了现在就开始吧 正文 作为大数据基础架构工程师&#xff0c;业界也笑称“运维Boy”&#xff0c;日常工作就是在各个机器上部署以及维…

2024 年广东省职业院校技能大赛(高职组)“云计算应用”赛项样题 3

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件…

C语言文件操作1

1.文件的基础知识 ⚀文件 ▶︎概念◀︎ 文件是指存储在外部存储器上的数据集合。 常见的有&#xff1a;磁盘、U盘等等。 ▶︎作用◀︎ 保存数据 ▶︎文件名◀︎ 文件是指文件的标识符号&#xff0c;每个文件都有一个文件名。 文件名主要由三部分组成:文件路径文件名字文件后…

JSP课设:学校招生系统(附源码+调试)

Java web学校招生系统 Java web学校招生系统功能概述 &#xff08;1&#xff09;登录模块&#xff1a;学校招生系统提供管理员和考生两者登录角色&#xff0c;分别对应不同的功能&#xff0c;登录信息存储在数据库中。 &#xff08;2&#xff09;前台浏览&#xff1a;学校招生…

医药行业痛点以及OKR解决方案

一、背景 随着医药行业的快速发展和市场竞争的加剧&#xff0c;企业面临着前所未有的挑战和机遇。为了在激烈的市场竞争中立于不败之地&#xff0c;某知名医药企业决定引入OKR&#xff08;Objectives and Key Results&#xff0c;目标与关键成果&#xff09;管理模式&#xff0…

【多线程】进程process(进程的管理+进程的调度+分时复用(并发)+PCB)

文章目录 进程一、计算机的组成&#xff1a;1.指令&#xff08;Instruction&#xff09; 二、浅谈操作系统1.日常的操作系统1.操作系统内核内核&#xff1a;进程的隔离性&#xff1a; 三、进程&#xff08;process&#xff09;1.进程的概念2.进程的管理1.管理的两个角度&#x…

NAT网络地址转换原理解析

NAT&#xff08;Network Address Translation&#xff09;&#xff0c;即网络地址转换&#xff0c;是一种在1994年提出的地址转换技术。它的主要目的是在本地网络中使用私有地址&#xff0c;在连接互联网时转而使用全局IP地址。NAT实际上是为解决IPv4地址短缺而开发的技术。NAT…

基于javassm实现的旅游景点线路网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.…

基于JAVA+SpringBoot+UniApp+Vue的前后端分离的手机移动端图书借阅平台

一、项目背景介绍&#xff1a; 随着社会信息化的快速发展&#xff0c;图书馆作为知识传播和学术研究的重要场所&#xff0c;扮演着不可替代的角色。然而&#xff0c;传统的图书馆借阅方式存在一些问题&#xff0c;如人工操作复杂、排队等待时间长、信息交流不便等。为了提高用户…

STL库 —— vector 的编写

一、成员变量 二、容量成员 2.1 size 函数 我们在定义私有成员时就会发现&#xff0c;其中 _finish 相当于 string 中的 size 的地址&#xff0c; _endofstorage 相当于 string 中的 capacity 的地址&#xff0c;所以 size 函数和 capacity 函数其实基本没有改变。 size_t s…

蓝桥杯备赛合集

蓝桥杯 - 穿越雷区 解题思路&#xff1a; dfs 方法一&#xff1a; import java.util.Scanner;public class Main {static char[][] a;static int[][] visited;static int[] dx { 0, 1, 0, -1 };static int[] dy { 1, 0, -1, 0 };static long min Long.MAX_VALUE;static …

DtDay1

1.导图 2.mywidget.cpp源码 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//设置窗口大小this->resize(900,700);//设置窗口标题this->setWindowTitle("玄冥科技");this->setWindowIcon(QIcon("C:\\Users…

3D打印技术引领压铸模具制造新变革

随着工业4.0浪潮的席卷&#xff0c;3D打印技术以其独特优势&#xff0c;正逐渐成为新一轮工业革命中的璀璨明星。这一技术不仅为“中国制造”向“中国智造”的转型提供了强大动力&#xff0c;也为压铸模具这一铸造行业的重要分支带来了前所未有的变革。 压铸模具&#xff0c;作…

day02 51单片机

51单片机学习 1闪烁LED 1.1 需求描述 这个案例,我们要让P00引脚对应的LED按照1秒闪烁1次。 1.2 硬件设计 1.1 软件设计 1)LED闪烁的代码 想让LED闪烁,就需要P00的值不断在0和1之间循环变化。实现这一功能的代码也很简单: #include <STC89C5xRC.H> //包含STC89…

[lesson10]C++中的新成员

C中的新成员 动态内存分配 C中的动态内存分配 C中通过new关键字进行动态内存申请C中的动态内存申请是基于类型进行的delete关键字用于内存释放 new关键字与malloc函数的区别 new关键字是C的一部分malloc是由C库提供的函数new以具体类型位单位进行内存分配malloc以字节位单位…

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

Lesson1--数据结构前言

1. 什么是数据结构&#xff1f; 2. 什么是算法&#xff1f; 3. 数据结构和算法的重要性 4. 如何学好数据结构和算法 5. 数据结构和算法书籍及资料推荐 1. 什么是数据结构&#xff1f; 数据结构(Data Structure) 是计算机存储、组织数据的方式&#xff0c;指相互之间存在一…

UWB 雷达动目标检测

1. 静态载波滤除 1. 首先对所有接收脉冲求平均得出参考接收脉冲 [Cir数据为二维数组64*n&#xff0c; 其中n为慢时间域采样的数据帧数] 2. 接着利用每一束接收脉冲减去参考接收脉冲就可以得到目标回波信号&#xff0c;参考接收脉冲的表达式为 2. RD 谱 对雷达回波做静态载波滤…

局域网配置共享文件夹,开机自动共享

设置文件夹共享 选择文件夹&#xff1a;首先&#xff0c;确定你想要共享的文件夹。共享文件夹&#xff1a;右键点击文件夹&#xff0c;选择“属性”&#xff0c;然后切换到“共享”标签页。点击“高级共享”&#xff0c;勾选“共享此文件夹”&#xff0c;并设置共享名称。 配置…

基于yolov9来训练人脸检测

YOLOv9是一个在目标检测领域内具有突破性进展的深度学习模型&#xff0c;尤其以其在实时性与准确性上的优秀表现而受到广泛关注。针对人脸检测这一特定任务&#xff0c;YOLOv9通过其架构创新和算法优化提供了强大的支持。 YOLOv9在继承了YOLO系列&#xff08;如YOLOv7、YOLOv8&…