信息竞赛笔记(2)––快速幂

目录

快速幂

定义

分析 

代码

递归实现

非递归实现(通用方法)

 模意义下取幂


快速幂

定义

快速幂,二进制取幂(Binary Exponentiation,也称平方法),是一个在O(log\: n)的时间内计算a^{n}的小技巧,而暴力的计算需要O(n)的时间。

这个技巧也常常用在非计算的场景,因为它可以应用在任何具有结合律的运算中。

                                                                                                                ––––摘于OIwiki

分析 

        我们算n个a相乘是,有时候会因为数据太大而超时,枚举的方法就不适用了.但是我们知道a^{b+c}=a^{b}\times a^{c},a^{nm}=(a^{n})^{m}.二进制取幂的想法是,我们将取幂的任务按照指数的 二进制表示 来分割成更小的任务。

        于是我们只需要知道一个快速的方法来计算上述 3 的a^{k}次幂的序列。这个问题很简单,因为序列中(除第一个)任意一个元素就是其前一个元素的平方。 

        举个栗子:

        

这么说,如果你想要计算3^{15},就可以推出以下式子:

3^{15}=3^{1}\times 3^{2}\times 3^{4}\times 3^{8}=\cdots 

根据上述举例不难发现,求大数字的幂运算已经被我们转化成了形式相同的子运算

代码

代码的话我认为有两种思路,一种是递归实现,一种是非递归实现.

递归实现

long long qkpow(long long x,long long y){
    if(y==0){
        return 1;
    }
    long long res=qkpow(x,y/2);
    if(y%2){
        return res*res*x;
    }else{
        return res*res;
    }
}

非递归实现(通用方法)

由于递归的时间太慢了,所以我们一般不用递归来求快速幂,而是用普通的位运算来求快速幂,理论上两者的时间复杂度是相同的,都是O(log\: n),但是实践上第二种要比递归快得多

long long qkpow(long long x,long long y){
  long long res=1;
  while(y>0){
    if(y&1){
        res=res*x;
    }
    x=x*x;
    y>>=1;
  }
  return res;
}

 模意义下取幂

        模意义下取幂也是一种常见的算法思路,它也可以应用在许多方面,例如它可以用于计算模意义下的乘法逆元。

        既然我们知道取模的运算不会干涉乘法运算,因此我们只需要在计算的过程中取模即可。

long long qkpow(long long x,long long y){
  long long res=1;
  while(y>0){
    if(y&1){
        res=res*x%m;
    }
    x=x*x%m;
    y>>=1;
  }
  return res;
}

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

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

相关文章

yolov5部署到android studio

目录 环境获取demo将pt文件导出为ptl文件修改demo修改PrePostProcessor增加ptl文件并增加类别文件修改MainActivity 大功告成 环境 Ubuntu22.10 Pytorch2.0.1cu117 Android Studio Flamingo | 2022.2.1 Patch 1 获取demo git clone https://github.com/pytorch/android-demo…

day43|动态规划6-完全背包及其应用-零钱兑换II-组合总和IV

完全背包 前情提要: 0-1背包指的是给定背包重量,将物品放入背包中,使得背包中的物品达到最大的价值。(每个物品只能往其中放一次) 在0-1背包问题中,第二层for循环需要是倒序遍历才可以保证每个物品只使用一…

重估端到端原则

评价技术迭代的旧的定势眼光来自于该技术诞生时。 1970/80/90 年代,相比传输带宽技术,处理器更强。网络协议倾向于字段多,字段小且紧凑,尽可能减少传输量,用 “算法技巧” 等价,如果 TCP 序列号 48 位&…

使用 Docker 部署 Jenkins 代理(主从)控制服务器

自动化是 DevOps 的核心。各种自动化工具和技术真正实现了持续集成和持续交付的概念。这些工具多年来发展迅速,但似乎永远存在的一个名字是Jenkins。 我们不会在这篇文章中讨论 CI-CD 的介绍性概念,也不会浪费时间展示 Jenkins 安装步骤。如果您是 Jenk…

字节面试这么难?6年测开被暴虐.....

前几天我朋友跟我吐苦水,这波面试又把他打击到了,做了快6年软件测试员。。。为了进大厂,也花了很多时间和精力在面试准备上,也刷了很多题。但题刷多了之后有点怀疑人生,不知道刷的这些题在之后的工作中能不能用到&…

【python】之loguru库,好用的日志管理库!

在 Python 中用到日志记录,那就不可避免地会用到内置的 logging标准库 。虽然logging 库采用的是模块化设计,你可以设置不同的 handler 来进行组合,但是在配置上通常较为繁琐;而且如果不是特别处理,在一些多线程或多进…

Nautilus Chain全球行分享会,深圳站圆满举办

在北京时间 6 月 4 日,由 Nautilus Chain 主办的“Layer3 模块化区块链的发展探讨”为主题的全球行活动,在深圳(深圳南山区清华研究院)顺利举办,本次分享会联合主办方还包括 Stanford Blockchain Accelerator、Zebec …

OpenGL简介

1.简介 一般它被认为是一个API,包含了一系列可以操作图形、图像的函数。然而,OpenGL本身并不是一个API,它仅仅是一个由Khronos组织制定并维护的规范(Specification)。OpenGL规范严格规定了每个函数该如何执行,以及它们的输出值。…

开发一个收废品小程序步骤

随着环保意识的提升和可持续发展的迫切需求,废品回收成为了一个重要的议题。预约上门回收小程序的开发为用户提供了方便、快捷的废品回收服务,促进了废品资源的再利用和环保行动的推进。本文将介绍开发预约上门回收小程序的流程,以帮助开发人…

IDEA启动图片更改替换(2021.1/2022及其之后的版本)

目录 先说2022.1及其之后的版本: 2022.1之前的版本: 2022其他版本修改方法 最近一直在整理接口数据,盯屏幕太久了,然后打开IDEA突然感觉这个启动页面好刺眼,正好整理工作做完了,中午有空就找了下方法,发现了不少坑,…

Linux命令(26)之uptime

Linux命令之uptime 1.uptime介绍 linux命令uptime是用来为用户提供系统从开启到当前运行uptime命令时系统已运行的时长信息,除此之外,还提了系统启动时间,当前登录用户,系统平均负载信息。 2.uptime用法 uptime [参数] uptime…

ChatGPT 提示的艺术 —— 如何编写清晰有效提示指南

ChatGPT 提示的作用 正如我们之前提到的那样,ChatGPT 对话中使用的提示的质量可以显著影响对话的成功。定义清晰的提示可以确保对话保持在正确的轨道上,并涵盖用户感兴趣的主题,从而产生更引人入胜和信息丰富的体验。 那么什么样的 ChatGPT…

Linux进程间通信——管道,共享内存,消息队列,信号量

进程间通信 文章目录 进程间通信进程间通信的方式进程间通信的概念如何实现进程间通信管道什么是管道 进程间怎么通信 匿名管道pipe函数创建管道通信读写特征写慢读快写快读慢写端关闭,读端读完读端关闭,写端? 管道特征 命名管道命名管道特性…

2023接口自动化测试,完整入门篇(超详细~)

一、自动化测试 众所周知,自动化测试已经成为软件项目中不可或缺的测试方法。基于用户交互界面(GUI)的自动化测试方法具有模拟用户行为和过程可视化的特点,因此受到了广大入门自动化人士的喜爱。诸如:QTP、Selenium等…

BR 5AP1130.156C-000

物料号: 5AP1130.156C-000 描述: 自动化装置面板 15.6" FullHD TFT - 1920 x 1080 像素 (16:9) - 多点触控(投射电容) - 开关柜安装 - 横向 - 用于 PPC900/PPC2100/PPC3100/ 联接模块 B&R ID 代码0xEC5D许可证 显示屏 类型TFT 彩色对角线…

图论试题2020

n-m 2 16 Pk(Kn)k(k-1)…(k-n1)。 C:A2对角线元素aii2等于对应顶点vi的度数,所以对角线元素之和等于边数的两倍。 A的所有特征值的平方和等于A2的对角线元素之和。 B 完全图没有顶点隔,实际上也只有以完全图为生成子图的图没有顶点隔。 连通…

StarRocks案例2: 升级后性能变慢

文章目录 一. 问题描述二. 解决方案2.1 从慢查询定位2.2 定位CPU解析时间就的问题 一. 问题描述 2023-05-18 将StarRocks从2.3.0升级到2.5.5。 升级完成后,所有的查询均比较慢,前端报表页面点开也卡。 二. 解决方案 2.1 从慢查询定位 StarRocks慢查询…

大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据

大数据:HDFS存储原理,fsck命令查看文件副本状态,namenode元数据,edits流水账,fsimage合并,hdfs读取数据 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人&#xff0…

Spring Boot如何实现自定义Starter?

Spring Boot如何实现自定义Starter? 在 Spring Boot 中,Starter 是一种特殊的依赖,它可以帮助我们快速地集成一些常用的功能,例如数据库连接、消息队列、Web 框架等。在本文中,我们将介绍如何使用 Spring Boot 实现自…

web前端 --- BOM编程、DOM编程

BOM编程(browser object model -- 浏览器对象模型) BOM给JavaScript提供用来操作浏览器的若干的"方法" 操作 在 js 看来,一个完整的浏览器包含如下组件: window窗口 // 整个浏览器的窗口 |-- history …