码农知识堂 - 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 【模板】矩阵快速幂

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

    题目分析

    代码


    【模板】单源最短路径

    见【模板】单源最短路径

    题目分析

    见【模板】单源最短路径

    代码

    见【模板】单源最短路径


  • 相关阅读:
    Java中如何获取File大小,路径,修改时间,是否隐藏文件等属性呢?
    保姆级使用PyTorch训练与评估自己的HorNet网络教程
    设计模式(一)| 创建型模式(单例模式、原型模式等)
    [Python] Python编程技巧总结[不断更新....]
    13.02 命名空间简介与基本输入/输出精解
    随机流-RandomAccessFile
    VEX —— Functions|Arrays
    gitlab搭建
    使用vcpkg配置CGAL+visual studio 2022
    点击授权将用户信息存储到vuex中
  • 原文地址:https://blog.csdn.net/m0_61775106/article/details/134532348
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号