上限を見つけてあとは等式が成り立つかどうか調べるだけですね。
import scala.testing.Benchmark def pow(n :Int, e :Int) = (1 to e).foldLeft(1)((x, y) => x * n) val E = 5 def calc_upper() = { val e = Iterator.from(1).filter(e => e * pow(9, E) < pow(10, e)).next pow(9, E) * e } def solve() = { val pows = Array.range(0, 10).map(pow(_, E)) def digits(n :Int) :List[Int] = if(n == 0) Nil else (n % 10) :: digits(n / 10) def is_valid(n :Int) = digits(n).map(pows(_)).sum == n println ((2 to calc_upper()).filter(is_valid).sum) } object Test extends Benchmark { def run() = solve } println (Test.runBenchmark(10))