60 Days of Euler in F# - Problem 48

The Problem

The series, 11 + 22 + 33 + ... + 1010 = 10405071317.

Find the last ten digits of the series, 11 + 22 + 33 + ... + 10001000.

The Solution

I don't know what people working in C are doing to solve these problems that involve enormous integer values. But fortunately we're on the .NET stack and we have BigInteger. It makes solving this problem trivial.

let sum =
    Seq.unfold (fun state -> Some(state, state+1)) 1
    |> Seq.map (fun n -> pown (bigint n) n)
    |> Seq.take 1000
    |> Seq.sum
let str = string sum
str.Substring(str.Length - 10)

We start out by generating natural numbers with Seq.unfold. We use Seq.map to raise each element to its own power using pown. Then we take the first 1000 elements of that sequence. Then we sum those.

Next, we convert that number to a string. If you're curious, that string has 3001 characters in it. Last, we use Substring to get the last 10 digits of the string. That is our answer.

Other Posts in This Series