快速幂(快速幂取余)
引入公式
(a
*
b) %c = ((a % c)*
(b % c)) %c
普通求幂的解法
public static int pow(int x,int n) {int result = 1;for (int i = 0; i < n; i++) {result = result * x;}return result;}
这种写法的时间复杂度为 O(n),使用快速幂就能将时间复杂度降到O(log2n)
概念
顾名思义,快速幂就是一种快速计算底数的n次幂,它的时间复杂度可以达到O(log2N),和普通的相乘法效率有了非常大的提升
比如我们要算 2的 10 次方,怎么算才快?
最直观的方法就是 2
*
2=4,4*
2=8,8*
2=16 … 一直乘到第十个2,一共进行了9次相乘
于是出了如下代码先算 2的5次方再算2的5次方的平方,(25)2,一共进行了 5次相乘
先算 2
*
2=4,再计算 2的5次方 4*
4*
2,再计算2的五次方的平方,(((22)2)*
2)2,一共进行了4次乘法
引入二进制
快速幂通过二进制的位运算来理解
求 xn,比如求 210
如果把10变成二进制,那么就是 1010,于是就可以写出下面的式子
0*
20 + 1*
22 + 0*
22 + 1*
23
最后得出下面的式子
2^(0
*
2 0 + 1*
22 + 0*
22 + 1*
23 )
通过化简得到
2
^
(2^1)*
2^
(2^3)
也就是二进制为上为0的数被忽略了
那么我们在求 210的时候,就可以利用上面的解法
- 在计算的时候不断获取指数的每一个二进制位
- 如果二进制位为0,说明这一位无效,就把二进制位累成就好了
- 如果二进制位位1说明是有效数字,把累乘的结果和最后的结果相乘
实现代码
public static int pow(int x,int n) {int result = 1; //结果int index = x; //二进制位while (n != 0) {// 若果最后一位二进制为1说明是有效位// 把累乘的结果乘到结果中去if ((n&1) == 1) {result *= index;}index *= index;n>>=1;}return result;}
n =10,二进制表示就是 1010
- 首先从第一个二进制位开始,1010 第一个二进制是0,所以这一位不要,所以结果还是1,index变成 22
- 101最后一位是1,这个22这一位是要的,把它乘入 result,result=22,index变成 24
- 10最后一位又是0,所以这一位又可以忽略,index变成28
- 1最后一位是1,把它乘入 result (22*28),得到最后结果 210
快速幂取模
通过上面的公式
(a
*
b) %c = ((a % c)*
(b % c)) % c
代码
// 1000000007是一个质数(素数),对质数取余能最大程度避免结果冲突/重复
static int mod = 1000000007;public static int pow(int x,int n) {int result = 1; //结果int index = x; //二进制位while (n != 0) {// 若果最后一位二进制为1说明是有效位if ((n&1) == 1) {result *= index;result %= mod;}index *= index;index %= mod;n>>=1;}return result;}
快速幂(快速幂取余)相关推荐
- 快速幂(取余) c++
题意:求a的b次幂对p取余的结果 快速幂做法: #include<iostream> using namespace std; int main() {long long a,b,p;ci ...
- java取余位运算_java学习--高效的除模取余运算(n-1)hash
没有测试过使用取余运算符和位运算符都做同一件事时的时间效率! 取余运算符% 如3除以2取余数 int a = a = a%; 结果为1 上面是传统的方式进行求余运算. 需要先将10进制转成2进制到内存 ...
- 洛谷——P1226 取余运算||快速幂
P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^ ...
- 【面试相关】python实现快速幂取余算法详解
假设我们要计算 2102^{10}210 对1000取模的结果,可以很简单的得到24.但是如果要求 210002^{1000}21000 对1000取模的结果,常规方法就行不通了,因为常规的变量无法容 ...
- 洛谷 1226 取余运算||快速幂
洛谷 取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...
- 【数学】幂运算与快速幂取余
一.幂运算 1.幂的定义: 的幂就是多个相乘,记作,表示的次幂,即个相乘,我们把叫做底数,叫做指数. 2.幂的运算: 我们可以用公式将幂运算进行简化,公式如下: 3.求幂方法: (1). Python ...
- Python实现快速幂取余算法
引子 今天无意中,看到了慧科教育科技集团有限公司-后厂理工学院 的AI相关学员招募信息,要求颇高,还要做编程自测题,并且达到60分才建议进行课程的学习.我忍不住发送了报名信息,得到了自测题.看到了如下 ...
- 取余运算(mod,快速幂)
[题目描述] 输入b,p,k的值,求bpmodk的值.其中b,p,k×k为长整型数. [输入] 输入b,p,k的值. [输出] 求bpmodk的值. [输入样例] 2 10 9 [输出样例] 2^10 ...
- 快速幂取余算法总结详解
废话不多说, 直接步入正题. 现在oj网站的题或者竞赛的题,如果a的b次幂且b很大,那么题中大多会让你把结果对一个数取余也就是求模,例如a^b%c这种,当然如果是考高精度的题除外. 接下来我将提供一种 ...
最新文章
- XSLT教程 [转]
- Lync 2010迁移Lync 2013 PART6:迁移CMS
- android 图片操作
- Java中classLoader浅析
- java final修饰属性_Java final关键字用来修饰类、方法、属性
- java禁止js获取cookie_java中Cookie被禁用后Session追踪问题
- 200 行代码实现一个滑动验证码
- 浅谈UWB室内定位(三)_vortex_新浪博客
- 三 Hibernate持久化状态主键生成策略
- WGS84坐标系-地心地固坐标系-东北天坐标系
- Altium 怎么设置鼠标滚轮放大缩小
- Java单词首字母小写转大写
- WZOI-218疯狂吃鸡腿1
- win7 防火墙开启ping
- 使用TkMybatis逆向生成带中文注释文件,并使用其常用的方法
- 程序员的算法趣题Q68: 异性相邻的座位安排(1)
- 办公软件 office
- 18款奔驰C200L升级柏林之声音响,音质享受,驾驶乐趣
- 资金指数(ZJZS)指标
- 关于级联选择器Cascader数据太多会改变列表大小的问题