1. 快速幂
1.1. 功能
求 x p x^p xp
1.2. 原理:二进制拆分,倍增
将
p
p
p表示为二进制
n
=
l
o
g
2
p
p
=
∑
i
=
1
n
a
i
×
2
i
(
a
i
=
0
或
a
i
=
1
)
n=log_2p\\ p=\sum_{i=1}^na_i\times 2^i(a_i=0或a_i=1)
n=log2pp=i=1∑nai×2i(ai=0或ai=1)
则
x
p
=
x
a
0
×
2
0
+
a
1
×
2
1
+
.
.
.
+
a
n
×
2
n
=
x
a
0
×
2
0
×
x
a
1
×
2
1
×
.
.
.
×
x
a
n
×
2
n
x^p=x^{a_0\times2^0+a_1\times2^1+...+a_n\times2^n}\\ =x^{a_0\times2^0}\times x^{a_1\times2^1}\times ...\times x^{a_n\times2^n}
xp=xa0×20+a1×21+...+an×2n=xa0×20×xa1×21×...×xan×2n
对于
f
(
u
)
=
x
2
u
(
u
∈
N
∗
)
f(u)=x^{2^u} (u\in N*)
f(u)=x2u(u∈N∗)
f
(
u
)
=
x
(
u
=
0
)
f
(
u
)
=
f
(
u
−
1
)
2
(
u
>
0
)
f(u)=x\space\space(u=0)\\ f(u)=f(u-1)^2\space\space(u>0)
f(u)=x (u=0)f(u)=f(u−1)2 (u>0)
故可以递推求
x
2
i
x^{2^i}
x2i
1.3. 操作
遍历
a
a
a,也就是
p
p
p的二进制位
若
a
i
=
0
a_i=0
ai=0,则该项整个为
1
1
1,所以:
如果
a
i
=
1
a_i=1
ai=1,答案*=
x
2
i
x^{2^i}
x2i
如果
a
i
=
0
a_i=0
ai=0,答案*=1 (相当于没操作)
时间复杂度 l o g 2 p log_2p log2p
1.4. 实现
uint64_t pow(int x,int p){
uint64_t r=1,f=x;//答案和f(i)
while(p){
if(p&1){//该位二进制为1
r*=f;
}
p>>=1;
f*=f;
}
return r;
}