方法
- 对指数进行分解比如求 2 8 2^8 28,可以分解为 8=4+4,4=2+2,2=1+1,只需要累乘三次就可以得到 2 8 2^8 28的值
代码
求
a
b
a^b
ab末尾的三位数,其中MOD=1000
int FastExponentiation(int a, int b)
{
int answer = 1;
while (b != 0)
{
if (b % 2 == 1)
{
answer *= a;
answer %= MOD;
}
b /= 2;
a *= a;
a %= MOD;
}
return answer;
}
例题涉及到了快速幂,同时还要分析结果和原始数据的关系
N
=
a
0
+
a
1
∗
k
+
.
.
.
+
a
n
∗
k
n
,
N
′
=
a
0
+
a
1
+
.
.
.
+
a
n
,
N
−
N
′
=
a
1
∗
(
k
−
1
)
+
.
.
.
+
a
n
∗
(
k
n
−
1
)
(
N
−
N
′
)
%
(
k
−
1
)
=
0
⇒
N
′
=
N
%
(
k
−
1
)
N = a_0+a_1*k+...+a_n*k^n,\\ N' = a_0+a_1+...+a_n,\\ N-N' = a_1*(k-1)+...+a_n*(k^n-1)\\ (N-N')\%(k-1) = 0 \Rightarrow N' = N\%(k-1)
N=a0+a1∗k+...+an∗kn,N′=a0+a1+...+an,N−N′=a1∗(k−1)+...+an∗(kn−1)(N−N′)%(k−1)=0⇒N′=N%(k−1)