码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 洛谷 模板汇总 算法基础 python解析


    文章目录

    • P1226 【模板】快速幂
      • 题目分析
      • 代码
    • P3367 【模板】并查集
      • 题目分析
      • 代码
    • P3378 【模板】堆
      • 题目分析
      • 代码
    • P3383 【模板】线性筛素数
      • 题目分析
      • 代码
    • P3366 【模板】最小生成树
      • 题目分析
      • 代码
    • P3390 【模板】矩阵快速幂
      • 题目分析
      • 代码
    • 【模板】单源最短路径
      • 题目分析
      • 代码

    P1226 【模板】快速幂

    题目地址:【模板】快速幂

    题目分析

    快速幂原理:
    以这个为例 a = 2 , b = ( 11 ) 10 = ( 1011 ) 2 a=2,b=(11)_{10}=(1011)_{2} a=2,b=(11)10​=(1011)2​,求 2 11 。 2^{11}。 211。
    2 11 = 2 8 × 2 0 × 2 2 × 2 1 2^{11}=2^{8} \times 2^{0} \times 2^{2} \times 2^{1} 211=28×20×22×21,幂的次数正好对应 ( 1011 ) 2 (1011)_{2} (1011)2​
    那么只需循环判断即可。

    “”“
    ans = 1
    base = a = 2^1
    
    第一次循环
    b = 12 = '0b1011'  # 0b是python里的二进制标志
    1 = '0b0001'
    b & 1 = '0b0001' = 1
    ans = ans * base = 1 * 2 = 2
    base = 2^2
    b = b >> 1 = '0b101'
    
    第二次循环
    b & 1 = '0b001' = 1
    ans = 2 * 2^2 = 2^3
    base = 2^4
    b = b >> 1 = '0b10'
    
    第三次循环
    b & 1 = '0b00' = 0
    base = 2^8
    b = b >> 1 = '0b1'
    
    第四次循环
    b & 1 = '0b1' = 1
    ans = 2^3 * 2^8 = 2^11
    base = 2^16
    b = b >> 1 = 0 # b=0 退出循环
    
    最后的ans = 2^11.
    计算次数由O(b) => log(b)
    ”“”
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    通常对于快速幂一般结合取余(mod)来考。了解原理即可
    ( A + B )   m o d   P = ( A   m o d   P + B   m o d   P )   m o d   P (A+B) \, mod \, P = (A \, mod \, P + B \, mod \,P)\,mod\,P (A+B)modP=(AmodP+BmodP)modP
    ( A × B )   m o d   P = ( ( A   m o d   P ) × ( B   m o d   P ) )   m o d   P (A \times B)\,mod\,P=((A\,mod\,P) \times (B\,mod\,P))\,mod\,P (A×B)modP=((AmodP)×(BmodP))modP
    见代码。

    代码

    # 快速幂
    def quickpower(a: int, b: int):
        base = a
        ans = 1
        while b > 0:
            if b & 1:
                ans *= base
            base *= base
            b = b >> 1
        return ans
      
    # 快速幂应用--取余 
    def quickmod(a: int, b: int):
        base = a
        ans = 1
        while b > 0:
            if b & 1:
                ans *= base
                ans %= p
            base *= base
            base %= p
            b = b >> 1
        return ans
    
    a, b, p = map(int, input().split())
    # 只能过一半百分之五十
    # ans = quickpower(a, b) % p
    # print(f"{a}^{b} mod {p}={ans}")
    # AC
    ans = quickmod(a, b)
    print(f"{a}^{b} mod {p}={ans}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    P3367 【模板】并查集

    题目地址:【模板】并查集

    题目分析

    这个找并集就是找他们共同的祖先。就以题目例题来看.

    """
    n = 4, m = 7
    fa = [0, 1, 2, 3, 4]
    
    ① 1、2的祖先分别为1、2 不相等,输出N
    ② 将1、2合并,设2为1的祖先,fa = [0, 2, 2, 3, 4]
    ③ 1、2的祖先分别为2、2 相等,输出Y
    ④ 将3、4合并,设4为3的祖先,fa = [0, 2, 2, 4, 4]
    ⑤ 1、4的祖先分别为2、4 不相等,输出N
    ⑥ 将2、3合并,设3是2的祖先,fa = [0, 2, 3, 4, 4]
    ⑦ 1的爸爸是2,2的爸爸是3,3的爸爸是4 => 1的祖先是4
      4的祖先是4
      相等输出Y
    """
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这个找祖先的函数递归一下就可以了。
    见代码

    代码

    # 递归找爹
    def find(x):
        if x == fa[x]:
            return x
        fa[x] = find(fa[x])
        return fa[x]
    
    n, m = map(int, input().split())
    fa = [i for i in range(n+1)]  # 初始化自己为爹
    for _ in range(m):
        z, x, y = map(int, input().split())
        a, b = find(x), find(y)
        if z == 1:
            fa[a] = b
        else: # z == 2
            if a == b:
                print('Y')
            else:
                print('N')         
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    P3378 【模板】堆

    题目地址:【模板】堆

    题目分析

    代码


    P3383 【模板】线性筛素数

    题目地址:【模板】线性筛素数

    题目分析

    代码


    P3366 【模板】最小生成树

    题目地址:【模板】最小生成树

    题目分析

    代码


    P3390 【模板】矩阵快速幂

    题目地址:【模板】矩阵快速幂

    题目分析

    代码


    【模板】单源最短路径

    见【模板】单源最短路径

    题目分析

    见【模板】单源最短路径

    代码

    见【模板】单源最短路径


  • 相关阅读:
    Linux 系统中提供CPU性能分析工具整理
    记录Kettle连不上mysql8
    Spark Streaming
    关于各种PLMN的选择
    Vue+SpringBoot项目分离部署踩坑记录
    RL 实践(0)—— 及第平台辛丑年冬赛季【Rule-based policy】
    阿里巴巴内部:2022年全技术栈(架构篇+算法篇+大数据)你值得拥有
    向着趋势奔跑:银行客户中心转型,重构商业模式是关键
    Databend 开源周报 #70
    论文阅读 DyREP:Learning Representations Over Dynamic Graphs
  • 原文地址:https://blog.csdn.net/m0_61775106/article/details/134532348
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号