Project Euler 48
Project Euler 48
题目
Self powers
The series, \(1^1 + 2^2 + 3^3 + … + 10^{10} = 10405071317\).
Find the last ten digits of the series, \(1^1 + 2^2 + 3^3 + \dots + 1000^{1000}\).
解决方案
快速幂算法,可以在\(O(\log m)\)的时间复杂度内计算\(a^m \% p\)的值。
Python
代码如下:
1 | def quick_power(a: int, m: int, p: int): |
这个算法本质上是将幂\(m\)看作是二进制位。
并且,\(a^{2^i}\)可以很容易地由\(a^{2^{i-1}}\)计算出:\(a^{2^i}=(a^{2^{i-1}})^2\)。
因此,将幂指数\(m\)看作是二进制数,如果第\(i\)位上是\(1\),那么就将结果乘上\(a^{2^i}\)。将所有值累乘起来就得到答案。
由于Python
自带pow(a,m,p)
,因此直接调用即可。
代码
1 | N = 1000 |