【算法篇-数论】快速幂

news2025/7/9 5:59:53

快速幂

  • 1. 利用快速幂优化的时间复杂度
  • 2. 快速幂方法及代码
  • 3.总结

文章参考自 B站董晓算法

1. 利用快速幂优化的时间复杂度

所谓的快速幂就是快速计算底数的n次幂

暴力求幂的话时间复杂度为O(n)

利用快速幂可以做到

时间复杂度为 O(log2n)

2. 快速幂方法及代码

我们要求 a n a^{n} an (0 <= a,n < 2 31 2^{31} 231)

快速幂需要用到的思想是 二进制 和 倍增思想

比如 3 13 3^{13} 313 = 3 ( 1101 ) 3^{(1101)} 3(1101) = 3 8 3^{8} 38 * 3 4 3^{4} 34 * 3 1 3^{1} 31 ,这是二进制思想,把指数先换成二进制,然后找到1的位置,1的位置决定了是指数的多少次方,然后连乘即可。

还有就是倍增思想
对 a 做平方倍增,比如, 3 1 3^{1} 31, 3 2 3^{2} 32, 3 4 3^{4} 34, 3 8 3^{8} 38, 3 16 3^{16} 316
为什么要做这样的倍增?
因为二进制里面,从右往左,就是平方倍增。
我们按照二进制的方法拆分,得到的一定是1,2,4,8…这样的值
我们一步一步往下算, 3 ( 1101 ) 3^{(1101)} 3(1101) 只要二进制指数的位置是 1 就可以直接乘。
不理解没关系,直接看代码分析或许就明白了。

long long quickpow(long long a,int n)
{
    long long  res = 1; // 这是我们要的结果,因为是乘积,记住开始不要写成0
    while(n)//当指数n不为0时,就循环,因为我们每一次都让n >>= 1,相当于 n / 2
    {
        if(n & 1) res = res * a;//如果对应的二进制是1,就乘底数,否则不用计算
        a = a * a; //底数倍增
        n >>= 1;//n往右进一位,方便上面的 n & 1
    }
    return res; // 返回结果就是 a^n
}

我们来模拟一下
在这里插入图片描述

3.总结

以上就是快速幂的方法以及代码
时间复杂度从O(n),优化到O(log2n),是一种非常优秀的算法。
大家可以感受一下算法的美

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

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

相关文章

操作系统4小时速成:I/O管理,spooling脱机技术,设备分配,分配数据结构,IO调度,IO子系统,IO控制方式,IO分类

操作系统4小时速成&#xff1a;I/O管理&#xff0c;spooling脱机技术&#xff0c;设备分配&#xff0c;分配数据结构&#xff0c;IO调度&#xff0c;IO子系统&#xff0c;IO控制方式&#xff0c;IO分类 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xf…

一、什么是 MQ

MQ的概念 MQ &#xff08;Message Queue&#xff09;消息队列&#xff0c;是在消息传输过程中存储消息的容器。多用于分布式系统之间的通信。 队列是基础数据结构中 “先进先出” 的一种数据结构。 消息对列&#xff0c;指把要传输的数据消息放在队列中&#xff0c;用队列机制…

SpringBoot:速成总结+实战——员工管理系统

这篇文章先是总结SpringBoot&#xff0c;当然我很多源码都没有仔细的去抠&#xff0c;而且这样一个成熟的框架想都不用想就知道源码很复杂&#xff0c;先学框架怎么用。接着就用SpringBoot完成一个较为简单的项目&#xff1a;员工管理系统。 目录端口号被占用怎么办什么是Sprin…

Hadoop总结——Hadoop基础

一、Hadoop是什么 Hadoop是一个由Apache基金会所开发的分布式系统基础架构 主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题 广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈 二、Hadoop发展历史 1&#xff09;Lucene--Doug Cutting开…

python中深拷贝和浅拷贝的区别

文章目录值的引用浅拷贝可变数据类型与不可变数据类型不可变数据类型可变数据类型深拷贝深拷贝浅拷贝总结若将需要注释若干行&#xff0c;则将这些行选中&#xff0c;然后按住 ctrl / 键就可以了&#xff0c;再按一次&#xff0c;即可取消多行注释若要批量缩进&#xff0c;那么…

磷脂酰丝氨酸 猪脑(phosphatidylserine,PS)试剂级;丝氨酸磷脂

磷脂酰丝氨酸&#xff08;phosphatidylserine&#xff0c;PS&#xff09;又称丝氨酸磷脂&#xff0c;二酰甘油酰磷酸丝氨酸&#xff0c;简称PS&#xff0c;是一类普遍存在的磷脂&#xff0c;通常位于细胞膜的内层&#xff0c;磷酯化合物中的磷酸甘油酯类&#xff0c;是细胞膜组…

QGIS创建要素与属性

QGIS之矢量操作——创建要素与属性 创建要素 打开常用的工具条&#xff1a;View—Toolbar 这样常用的工具条就加载进来了 新建矢量图层&#xff0c;并设置字段等等&#xff1a; 创建属性&#xff0c;选中你的矢量图层&#xff0c;右键选择Toggle_Editing&#xff08;或者点击…

SpringBoot项目上线运维

文章目录一.高级属性配置1.1 简介1.2 临时属性设置1.3 配置文件的四级分类1.4 自定义配置文件二.多环境开发2.2 多环境开发&#xff08;yaml版&#xff09;2.3 多环境开发多文件版&#xff08;yaml版&#xff09;2.4 多环境开发&#xff08;Properties版&#xff09;2.5 多环境…

这次把怎么做好一个PPT讲清-画图篇

文章目录概述布尔运算PPT幻灯片中如何设置形状对象格式每一个图形既是一个形状&#xff0c;又是一个文本框如何用PPT来实现三维3D效果&#xff0c;附参数设置详解怎么用ppt画三维立体图?**PPT做3D可动样机****PPT做3D[动态图标]****PPT做3D插画**如何使用[PPT绘图]&#xff1f…

图像处理:图像清晰度评价

目录 0、实现效果 1、概述 2、模糊度分类 1、运动模糊 2、压缩模糊 3、高斯模糊 3、清晰度量化指标 Brenner 能量梯度函数(Energy of Gradient) ​编辑 Roberts Laplace SMD&#xff08;灰度方差&#xff09;函数 SMD2 &#xff08;灰度方差乘积&#xff09;函数 …

JUC学习笔记——并发工具线程池

在本系列内容中我们会对JUC做一个系统的学习&#xff0c;本片将会介绍JUC的并发工具线程池 我们会分为以下几部分进行介绍&#xff1a; 线程池介绍自定义线程池模式之Worker ThreadJDK线程池Tomcat线程池Fork/Join 线程池介绍 我们在这一小节简单介绍一下线程池 线程池简介…

Linux基础教程:9、linux进程管理(2)

前面我们讲到fork创建子进程&#xff0c;那么这一期我们接着讲创建进程之后如何调试以及插入其他进程、特殊进程、和进程如何退出&#xff1b; 同样我们写了一个C语言程序&#xff0c;但是在这个程序中是有两个进程&#xff0c;我们调试的时候只会选择一个进程调试&#xff0c…

了解ixgbe网卡驱动— 驱动注册(纯代码分享)

1 ixgbe 网卡注册驱动 和大部分设备驱动一样&#xff0c;网卡驱动是作为一个 module 注册到 kernel 的 通过 module_init() -> ixgbe_init_module() -> pci_register_driver() 注册 ixgbe_driver 通过 module_exit() -> ixgbe_exit_module() -> pci_unregister_dr…

【仿牛客网笔记】项目进阶,构建安全高效的企业服务——置顶、加精、删除

添加依赖&#xff0c;去掉版本 实现置顶、加精的修改&#xff0c;删除 首先开发数据访问层&#xff0c;因为是对帖子的操作所以无论是置顶、加精最终是要修改帖子&#xff0c;先打开DiscussPostMapper增加修改的操作&#xff0c;一个修改类型&#xff0c;一个修改状态。 打…

[iOS]MonkeyDev安装

MonkeyDev官方安装文档&#xff1a;https://github.com/AloneMonkey/MonkeyDev/wiki/%E5%AE%89%E8%A3%85 1.安装HomeBrew 终端输入指令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择源后安装 更多安装方式可以参…

HTML+CSS+JS大作业:网站设计——家具装修公司(12页 bootstrap, 响应式)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&#…

如何使用VMware12PRO安装Mac OS

VMware安装参考我的这篇文章http://t.csdn.cn/kZ3oh &#xff08;有VMware安装包&#xff09; 准备的工具 unlocker链接: https://pan.baidu.com/s/1a1akxL_-JjNu70HJqJORZw?pwd9sjk 提取码: 9sjk Mac OS10.11CDR镜像链接: https://pan.baidu.com/s/1LIz0qFIL0Jg2M83oGqiDW…

RepVGG:让VGG风格的ConvNet再次伟大起来

引言 经典的卷积神经网络&#xff08;ConvNet&#xff09;VGG [31]在图像识别中取得了巨大的成功&#xff0c;其简单的架构由conv、ReLU和池化的堆栈组成。随着Inception [33&#xff0c;34&#xff0c;32&#xff0c;19]、ResNet [12]和DenseNet [17]的出现&#xff0c;许多研…

【Struts2】一_idea快速搭建struts2框架

文章目录什么是SSH框架&#xff1f;Struts2框架1、struts2的环境搭建1.1 创建web项目&#xff08;maven&#xff09;&#xff0c;导入struts2核心jar包1.2 配置web.xml&#xff08;过滤器&#xff09;&#xff0c;是struts2的入口&#xff0c;先进入1.3 创建核心配置文件struts…

C语言日记 36 类的组合

书P137: 如果声明组合类的对象时没有指定对象的初始值&#xff0c;自动调用无形参的构造函数&#xff0c; 构造内嵌对象时也对应调用内嵌对象的无形参的构造函数。 Q1:这里&#xff0c;对于“构造内嵌对象时也对应调用内嵌对象的无形参的构造函数”&#xff1b;他指的是什么…