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
2
3
4
5
6
7
8
def quick_power(a: int, m: int, p: int):
ans = 1
while m > 0:
if m & 1:
ans = ans * a % p
a = a * a % p
m >>= 1
return ans

这个算法本质上是将幂\(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
2
3
4
5
6
7
N = 1000
mod = 10000000000
ans = 0
for i in range(1, N + 1):
ans = (ans + pow(i, i, mod)) % mod
print("{:09}".format(ans))

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
Ujimatsu Chiya 微信 微信
Ujimatsu Chiya 支付宝 支付宝