1.快速幂
原理:求a的b次方,将b转化为二进制数,该二进制位第i位的权是2^(i-1),
例如
11的二进制是1011
11 = 23×1 + 22×0 + 21×1 + 2o×1
因此,我们将a11转化为算
实现:
快速幂可以用位运算来实现
b
and
1
{也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
b
shr
1
{就是去掉b的二进制最低位(即第0位)}
C++实现为
b & 1
//取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
b>>1//把b的二进制右移一位,即去掉其二进制位的最低位.
递归版:
ll
pow
(ll a,ll i){
if
(i==0)
return
1;
int
temp=
pow
(a,i>>1);
temp=temp*temp%MOD;
if
(i&1) temp=(ll)temp*a%MOD;
return
temp%MOD;
}
非递归版:
ll f(ll a,ll b,ll n){
int
t,y;
t=1; y=a;
while
(b!=0){
if
(b&1==1) t=t*y%n;
y=y*y%n; b=b>>1;
}
return
t;