快速幂算法
顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
11=(1011)_2, 结果为1* (a) * (a*a) * (a*a*a*a)
时间复杂度为O(n), 那么我们有没有更快的办法呢? 有的~就是下面要说的快速幂。
快速幂就是把指数进行一次log(N)级别的变换。11 = 2^3+2^1+2^0
那么我只需要算3^1
和3^2
还有3^8
这样复杂度就降下来了。算3^1
需要一次记为a
,把a
平方就是3^2
记为b
,把b
平方就是3^4
记为c
,再平方就是3^8
记为d
,这样把a b d
乘以之后就是结果了。这样速度就快起来了~
int pow4(int a,int b){
int r=1,base=a;
while(b){
if(b&1) r*=base;
base*=base;
b>>=1;
}
return r;
}
进度:目前只看了快速幂,其他还待研究
二分幂,快速幂,矩阵快速幂,快速乘
https://blog.csdn.net/MosBest/article/details/69264953
引用原句
在我就说下我对二进制的感想吧:我们在做很多”连续“的问题的时候都会用到二进制将他们离散简化
1.多重背包问题
2.树状数组
3.状态压缩DP
……………还有很多。。。究其根本还是那句话:化连续为离散。。很多时候我们并不是为了解决一个问题而使用二进制,更多是时候是为了优化而使用它。所以如果你想让你的程序更加能适应大数据的情况,那么学习学习二进制及其算法思想将会对你有很大帮助。