简单位运算快速幂
假设我们要求ab,那么其实b是可以拆成二进制的,该二进制数第i位的权为2(i-1),例如当b==11时,a11=a(20+21+2^3)
1 | int poww(int a,int b){ |
11的二进制是``1011,
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1,因此,我们将a¹¹
转化为算a^(2^0)*a^(2^1)*a^(2^3)
其中比较重要的一步:base*=base
,即基底不断增加,如果二进制是1则*上基底否则不,ans
为所有基底相乘
1 | base*base==base^2 |
▲.由于指数函数是爆炸增长的函数,所以很有可能会爆掉int的范围,根据题意决定是用 long long啊还是unsigned int啊还是mod某个数啊自己看着办。
1 | typedef long long ll; |
Author: Mrli
Link: https://nymrli.top/2019/03/07/ACM-快速幂/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.