只用1万年就可以学懂的快速幂
Posted Lnn.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只用1万年就可以学懂的快速幂相关的知识,希望对你有一定的参考价值。
前言:应cc人要求而诞生的博客
问题:求出x的n次方的值(n <= 1e9)
朴素方法:将x乘n次。
复杂度:O(n),n大的时候跑不动。
快速幂:顾名思义,快速的(Ologn)求出数x的n次方
针对问题:重复的乘法操作(数、矩阵)
算法原理:任何数都可以用不同的2的幂来表示。
比如11 = 1011(2) , 11 = 8 + 2 + 1 , 2^11 = 2^8 * 2^2 * 2^1 。
所以我们可以只去算x的(1、2、4、8、16…)次方,根据n二进制1的位置来进行累乘,二进制位为0就不乘。
我们模拟一下求 2^11。
code:(带mod版,不需要可以将mod删去)
long long quickpow(long long aa,long long bb)
{
long long ans = 1 , base = aa;
while(bb){
if(bb&1)ans = (ans * base)%mod;
base = base * base %mod;
bb >>= 1;
}
return ans;
}
以上是关于只用1万年就可以学懂的快速幂的主要内容,如果未能解决你的问题,请参考以下文章
跳跳虎-图解+仿写 新手都能学懂的SpringBoot源码课