Project Euler Problem 48

The series, 1^1 + 2^2 + 3^3 + cdots + 10^{10} = 10405071317.

Project Euler Problem 48

Solution

Answer: 9110846700

1. Mathematical analysis

We want the last ten digits of

$$1^1 + 2^2 + 3^3 + \cdots + 1000^{1000}.$$

Since we only care about the last ten digits, we do modular arithmetic modulo $10^{10}$.

Let

$$S=\sum_{n=1}^{1000} n^n.$$

We want

$$S \bmod 10^{10}.$$

Key insight: modular reduction

Instead of computing gigantic numbers like $1000^{1000}$ directly, we repeatedly reduce modulo $10^{10}$:

$$n^n \equiv (n^n \bmod 10^{10})$$

and then sum:

$$S \equiv \sum_{n=1}^{1000}(n^n \bmod 10^{10}) \pmod{10^{10}}.$$

This works because modular arithmetic preserves addition:

$$(a+b)\bmod m = ((a\bmod m)+(b\bmod m))\bmod m.$$

Exponentiation can also be performed efficiently modulo $m$ using modular exponentiation (repeated squaring). In Python, the built-in function

pow(base, exponent, modulus)

computes:

$$\text{base}^{\text{exponent}} \bmod \text{modulus}$$

efficiently, without ever constructing the enormous full integer.

So we compute:

$$\sum_{n=1}^{1000} \text{pow}(n,n,10^{10})$$

and take modulo $10^{10}$.

We can sanity check on the small example:

$$1^1+2^2+\cdots+10^{10} = 10405071317.$$

The last ten digits are:

$$0405071317,$$

which matches:

$$10405071317 \bmod 10^{10} = 405071317$$

(with a leading zero if displayed as ten digits).


2. Python implementation

# We only care about the last 10 digits
MOD = 10**10

# Compute the sum of n^n for n from 1 to 1000,
# reducing modulo MOD at every step
total = sum(pow(n, n, MOD) for n in range(1, 1001))

# Keep only the last ten digits
answer = total % MOD

print(answer)

3. Code walkthrough

Step 1: Define the modulus

MOD = 10**10

We only want the last ten digits, so all calculations happen modulo:

$$10^{10}=10000000000.$$


Step 2: Compute each term efficiently

pow(n, n, MOD)

This computes:

$$n^n \bmod 10^{10}$$

using fast modular exponentiation.

For example:

pow(10, 10, 10**10)

returns the last ten digits of $10^{10}$.


Step 3: Sum the terms

total = sum(pow(n, n, MOD) for n in range(1, 1001))

This adds:

$$1^1,2^2,\ldots,1000^{1000}$$

but each term is already reduced modulo $10^{10}$.


Step 4: Extract the final ten digits

answer = total % MOD

We reduce once more to ensure only the final ten digits remain.


Verify with the small example

If we replace 1001 by 11:

MOD = 10**10
test = sum(pow(n, n, MOD) for n in range(1, 11)) % MOD
print(test)

Output:

10405071317

which matches the problem statement exactly.

Running the full computation for $1$ to $1000$ gives:

$$9110846700$$


4. Final verification

  • We expect a number with at most 10 digits → result has exactly 10 digits.
  • Since we used modulo $10^{10}$, the answer is guaranteed to be the correct last ten digits.
  • This is the known verified result for Project Euler Problem 48.

Answer: 9110846700