快速幂(c++,超级详细)

快速幂

如果我们打算求a^b, 我们可能会写一个for循环,乘以b次a,时间复杂度为O(b)

当b比较小的时候还可以运用,但是当b很大,比如b=1000000,此时时间复杂度就显然很高了,我们需要对其进行优化 ———快速幂

开始之前,先说两个前置知识:

1 二进制构成数字

众所周知,每个十进制数都可以由唯一的二进制数表示

例如:13的 二进制表示为 1101 即表示为 1*2^3 + 1*2^2 + 0*2^1 + 1*2^013可以由8+4+1组成

我们不难发现,每一个十进制数都由其对应的二进制数,那么每一个十进制数都可以有1 2 4 8 32 64 … 等这种二的次方数相加得到,并且每一种数只能取1个或0个

再例如 9,其二进制为1001 , 8+1=9 ,即由1个8和1个1相加得到9

2 位运算

& 运算符可以直接对二进制进行操作,1 & 1 = 11 & 0 =00 & 1 = 00 & 0 = 0

我们不难发现只有1&1才是1,根据这个思想,我们可以判断当前数字的二进制是否有1

>> 右移运算符,可以删掉末尾二进制数例如5 的二进制为101 5>>1 ==2 2的二进制为10 删掉了原先末尾的1再例如6的二进制为110 6>>1==3 3的二进制为11 删掉了末尾的0

其实不难发现,右移1就是乘以2,>>n,就是乘以2^n次方

结合&和>>

我们可以写个循环。逐渐判断每一位是否是1

int b  = 13;
int res = 0;//统计b二进制1的数目
while(b){if(b&1==1)res++; //如果当前位为1,就统计+1b = b>>1;//将末尾位删掉
}

3 快速幂算法(不取余版)

学完前面两个前置知识,我相信再学习 快速幂 将会很简单

首先假设我们要求5^13次方

13的二进制为1101 所以13 = 8+4+1;

即5^13 = 5^1 * 5^4 * 5^8

ps: 幂运算可是高中数学学的 a^(m+n) = a^m * a^n;

有这些知识我们就能直接看代码了

要是还有疑惑点,看代码注释也能看懂

long long quick_pow(long long a,long long b){//计算a^b次方long long res = 1;//用res保存答案//当b变成0后就可以停止循环了while(b){if(b & 1) ans*=a;//如果b当前二进制为1就要乘上这个数b>>=1; //将b末尾的二进制数删掉a*=a; // 将a乘以自己进行翻倍//比如,开始a==5,接下来a = 5^2,a=5^4,a=5^8,a=5^16....//通过遍历每个在范围内的2的次方数来更新a}
}

4 取模版快速幂

快速幂只有五行代码,是不是很简单呢

不过别急,上面的快速幂是最原始版的,一般不是很常用,当a本身非常大时,如果a*a可能 long long 都给爆掉了,所以我们一般会采取取模的方式进行运算

前置知识 (a *b *c *d )%p = (((a *b)%p *c)%p *d)%p

即每次乘以下个数前可以先取模,这样最后答案不变,所以我们的代码可以进行优化了

LL quick_pow(LL a, LL b, LL p){ //LL是long long 的缩写//p是要对取模的数字LL ans = 1;while(b){if(b & 1)ans =(ans*a)%p;b >>= 1;a = (a*a) % p;}return ans;}

原题链接:875. 快速幂 - AcWing题库

完整代码

#include<iostream>using namespace std;
typedef long long LL;
LL n;
LL quick_pow(LL a, LL b, LL p){LL ans = 1;while(b){if(b & 1)ans =(ans*a)%p;b >>= 1;a = (a*a) % p;}return ans;}
int main(){cin>>n;while(n--){LL a,b,p;cin>>a>>b>>p;cout<<quick_pow(a,b,p)<<endl;}return 0;
}

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

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

相关文章

JDBC快速入门

JDBC快速入门 PS&#xff1a;上传图片有点问题&#xff0c;我整理成了PDF格式&#xff0c;方便看图文。 今日目标 掌握JDBC的的CRUD理解JDBC中各个对象的作用掌握Druid的使用 1&#xff0c;JDBC概述 在开发中我们使用的是java语言&#xff0c;那么势必要通过java语言操作数据库…

【ARM AMBA AXI 入门 14 -- AXI 窄位传输 | 非对齐传输| 大小端传输】

请阅读【ARM AMBA AXI 总线 文章专栏导读】 文章目录 窄位传输 (Narrow Transfer)非对齐传输 (Unaligned Transfer)大小端传输 (Endianness Transfer)ARM AMBA AXI (Advanced eXtensible Interface) 是一个高性能、高带宽的总线接口,常用于连接高速微处理器核心与其它部件。在…

模拟电路总结

一、半导体器件 1.1 半导体的特性 导电性能介于导体和绝缘体之间。如&#xff1a;硅&#xff08;Si&#xff09;、锗&#xff08;Ge&#xff09; 1.1.1 本征半导体 纯净的、不含杂质的半导体 温度敏感&#xff1a;T0K时&#xff0c;绝缘&#xff1b;温度升高时&#xff0c;载流…

Thinkphp-商城项目之oss文件上传及web端直传

4.3头像上传 一般商城网站都会把文件上传到第三方云&#xff0c;例如阿里云(oss)&#xff0c;腾讯云(cos)&#xff0c;当然如果公司有足够的实力&#xff0c;可以自己部署一台文件服务器&#xff0c;用于文件的保存。 头像上传一般是用户在用户中心上传的&#xff0c;后台管理…

软件需求的三大层次,逐层细化的注意事项

需求逐层分解和转化是一个持续优化的过程&#xff0c;在这个过程中&#xff0c;我们需要明确软件需求的三大层次&#xff0c;从而帮助项目团队理解组织或客户的高层目标和期望&#xff0c;满足用户的期望和需求&#xff0c;有助于产品的系统设计和开发。 一、软件需求三大层次 …

【力扣的101夜】轮转数组

public void rotate(int[] nums, int k) { } 用 Syst.arraycopy 五个参数是 System.arraycopy(nums, length - step, temp, 0, step); nums&#xff1a;源数组&#xff0c;即要从中复制元素的数组。length - step&#xff1a;源数组的起始位置&#xff0c;即从哪个索引开始复…

坑惨啦!!!——符号冲突案例分析

背景 前段时间在北汽项目中&#xff0c;遇到了一个奇怪现象&#xff1a;程序启动之后&#xff0c;偶现运行一段时间后&#xff0c;crash&#xff0c;复现频率较高。困扰了大家较长时间。最终在和同事的不懈努力下&#xff0c;找到的根因&#xff0c;并找到了解决方法。过程中也…

影视行业如何远程完整快速传输大文件?

影视行业是一个充满创意和协作的领域。在影视制作中&#xff0c;涉及到多个环节和部门&#xff0c;包括编剧、导演、摄影、剪辑、配音、视效等。这些环节和部门通常分布在不同的地点&#xff0c;甚至不同的国家。因此&#xff0c;影视制作过程中需要频繁进行远程传输&#xff0…

前后端-记录

目录 ApiRESTful API Api api Application Programming Interface 应用程式界面 RESTful API rest Representational State Transfer 表现层状态转移&#xff0c;属于设计风格&#xff0c;不是强制标准 满足rest的 restful

科技赋能,创新发展!英码科技受邀参加2023中国创新创业成果交易会

11月17日至19日&#xff0c;2023中国创新创业成果交易会&#xff08;简称&#xff1a;创交会&#xff09;在广州市广交会展馆圆满举行。英码科技受邀参加本届创交会&#xff0c;并在会场展示了创新性的AIoT产品、深元AI引擎和行业热门解决方案。 据介绍&#xff0c;本届创交会由…

vscode编写verilog的插件【对齐、自动生成testbench文件】

vscode编写verilog的插件&#xff1a; 插件名称&#xff1a;verilog_testbench,用于自动生成激励文件 安装教程&#xff1a;基于VS Code的Testbench文件自动生成方法——基于VS Code的Verilog编写环境搭建SP_哔哩哔哩_bilibili 优化的方法&#xff1a;https://blog.csdn.net…

CMake 判断操作系统类型

上回的CMakeLists.txt里面有一句,if (WIN32)......endif(WIN32); 根据资料,这是判断操作系统是否是Windows; 下面单独看一下; 一个CMakeLists.txt文件如下; if(WIN32)# 如果是 Windowsmessage("当前操作系统为 Windows") elseif(UNIX AND NOT APPLE)# 如果…

c# socknet编程

c#服务端 using System.Text; using System.Net.Sockets; using System.Net;class proj {internal static void Main(string[] args){string ip "";int port 5000;byte[] buffernew byte[1024*1024*2];Socket socket null;//1 实例化套接字&#xff08;ipv4寻址协…

Go 语言学习:了解 const 关键字及常量声明

如果一个变量应该有一个固定的、不能改变的值&#xff0c;你可以使用const关键字。 const关键字将变量声明为"常量"&#xff0c;这意味着它是不可改变和只读的。 语法 const CONSTNAME type value 声明常量 声明常量的示例&#xff1a; package main import (…

【MATLAB基础绘图第17棒】绘制玫瑰图

MATLAB绘制玫瑰图 玫瑰图&#xff08;Nightingale Rose Chart&#xff09;风玫瑰图&#xff08;WindRose&#xff09;准备工作&#xff1a;WindRose工具包下载案例案例1&#xff1a;基础绘图 参考 玫瑰图&#xff08;Nightingale Rose Chart&#xff09; 玫瑰图&#xff08;Ni…

Vue2系列 — $listeners 多层嵌套组件通信

涉及爷爷组件和孙组件通信&#xff0c;孙组件可以 emit 数据到父组件&#xff0c;父组件再 emit 数据到爷爷组件&#xff0c;实现组件通信&#xff0c;但是比较繁琐 使用 $listeners 可以实现孙组件的数据直接传递到爷组件中去 官网原文&#xff1a;https://v2.cn.vuejs.org/…

Java_异常详解

前言 异常是什么,异常如何抛出,如何抛出自定义异常,异常处理主要的五个关键字&#xff1a;throw,try,catch,finally,throws ,异常的处理流程 异常是什么 在Java中&#xff0c;将程序执行过程中发生的不正常行为称为异常。比如之前写代码时经常遇到的&#xff1a; 1. 算数异…

app小程序定制开发的优势|企业软件网站建设

app小程序定制开发的优势|企业软件网站建设 小程序定制开发是目前互联网行业中备受关注的领域之一。随着智能手机的普及和移动互联网的迅猛发展&#xff0c;越来越多的企业和个人开始重视小程序的潜力&#xff0c;并积极寻求定制开发的服务。那么&#xff0c;为什么小程序定制开…

php字符串处理函数的使用

php字符串处理函数的使用 trim() trim()函数的功能用于去除字符串首尾的空白字符(包括空格、制表符、换行符等&#xff09;。它可以用于清理用户输入的数据或去除字符串中的多余空格。 <?php $char" holle world! ";echo trim($char) ?>str_repl…

【LeetCode】104. 二叉树的最大深度

104. 二叉树的最大深度 难度&#xff1a;简单 题目 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 …