【题解提供者】吴立强
解法
思路
指数函数增长速率过快,直接计算中间过程任何一种基本类型都无法存储。
通过乘法运算的规律,可以发现末两位数只和末两位数相关,故直接对中间结果保留末两位数(mod 100)即可避免乘法溢出。
代码
#include <iostream>
using namespace std;
const int mod = 100;
int main() {
int n; cin >> n;
int ans = 1;
while(n --) ans = (ans * 92) % mod;
cout << ans;
return 0;
}
算法分析
本算法的时间复杂度为 O ( n ) O(n) O(n)。
拓展
实际上对于任意的
(
a
×
b
)
m
o
d
p
(a\times b)\mod p
(a×b)modp 的求解都可以转化为:
(
(
a
m
o
d
p
)
×
(
b
m
o
d
p
)
)
m
o
d
p
((a\mod p)\times (b\mod p))\mod p
((amodp)×(bmodp))modp。
a
a
a 可以看做是
a
=
k
1
×
p
+
(
a
m
o
d
p
)
a = k_1\times p + (a\mod p)
a=k1×p+(amodp)。
b
b
b 可以看做是
b
=
k
2
×
p
+
(
b
m
o
d
p
)
b = k_2\times p + (b \mod p)
b=k2×p+(bmodp)。
那么有:
(
a
×
b
)
m
o
d
p
(a\times b)\mod p
(a×b)modp
=
(
(
k
1
×
p
+
(
a
m
o
d
p
)
)
×
(
k
2
×
p
+
(
b
m
o
d
p
)
)
)
m
o
d
p
=((k_1\times p + (a\mod p)) \times (k_2\times p + (b \mod p)))\mod p
=((k1×p+(amodp))×(k2×p+(bmodp)))modp
=
(
(
k
1
×
k
2
+
k
1
×
(
b
m
o
d
p
)
+
k
2
×
(
a
m
o
d
p
)
)
×
p
+
(
a
m
o
d
p
)
×
(
b
m
o
d
p
)
)
m
o
d
p
=((k_1\times k_2+ k_1\times(b\mod p)+ k_2\times(a \mod p))\times p + (a\mod p)\times (b\mod p))\mod p
=((k1×k2+k1×(bmodp)+k2×(amodp))×p+(amodp)×(bmodp))modp
=
(
(
a
m
o
d
p
)
×
(
b
m
o
d
p
)
)
m
o
d
p
=((a\mod p)\times (b\mod p))\mod p
=((amodp)×(bmodp))modp。