(复学梳理) 快速幂求模[代码思想详解]
来源:互联网 发布:3d打印机切片算法 编辑:程序博客网 时间:2024/06/07 05:39
首先,给出代码:
const LL mod = 1000000007;LL quick(LL a,LL b){ LL ans=1; a=a%mod; while(b!=0) { if(b&1) ans=(ans*a)%mod; b>>=1; a=(a*a)%mod; } return ans;}
代码看起来十分的简洁。快速幂求模,就是解决大数求高次方后取模的算法。
最基础的求高次方的算法,就是使用for循环来实现,但是这个算法的时间复杂度就和次方数成正比了,当次方数很大时,如10^15时,那么算法一定是超时的。
那么如何快速求出呢?这就运用了二进制的特点了。
例如: 当我们要求2^7时,for循环要使用6次乘法,次数和次方数成正比。
但是,我们知道,7的二进制是111,所以我们可以将2^7分解为:2^1 * 2^2 * 2^4,只用使用2次乘法,和二进制的位数成正比。
也就是,将7按照二进制分解为:7=1+2+4
整体思想就是,利用二进制的特点,将值的数量级计算,转化为位数的数量级计算。
代码详解:
求a^b:
将b看成二进制的0,1数组,从低位向高位移动扫描。
当第i位为1时,表示要乘上一个a^(2^i),而每向高位移动一位,a^(2^i)的结果就会翻一倍。
所以代码中,用ans来表示最后的答案,而用a来表示:若第i位1时,a^(2^i)的值。
而b用来控制。
阅读全文
0 0
- (复学梳理) 快速幂求模[代码思想详解]
- 快速排序思想及C语言代码
- 快速排序基本思想以及代码实现
- 快速排序代码及逻辑思想
- 快速排序代码详解
- 快速幂 矩阵快速幂思想详解及例题
- 快速幂取模(二分思想)
- 快速幂取模(分治思想)
- 快速排序 (递归思想)
- 梳理caffe代码internal_thread(九)
- 梳理caffe代码blocking_queue(十)
- 梳理caffe代码data_reader(十一)
- 梳理caffe代码data_transformer(十二)
- 梳理caffe代码io(十三)
- 梳理caffe代码solver(十四)
- 梳理caffe代码sgd_solvers(十五)
- 梳理caffe代码im2col(十七)
- 梳理caffe代码base_conv_layer(十八)
- 小朋友学C语言(20):数组
- 程序排优
- 第3章 面向对象基础知识
- Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration.
- 汇编语言(2)
- (复学梳理) 快速幂求模[代码思想详解]
- Windows系统下利用caffe训练NYU Depth数据集(一)
- SOAP简单对象访问协议
- 【BZOJ1911】【APIO2010】特别行动队
- Leetcode SQL题
- Linux chmod 命令
- 取石子
- 一致性hash算法
- 剑指offer之二十三---最小的K个数