追記:まともなアルゴリズムによる解法
ちょっと悩んだけれど、まともな解法も考えつくことができた。基本的には篩方式のアルゴリズム。
object Prob216 { def solve { val N = 50000000 //10000 val nToT: Int => Long = n => 2L * n * n - 1 val tSeq = Array.tabulate(N + 1)(nToT) for { n <- 2 to N view; t = tSeq(n) if t != 1 ofs <- Seq(-n, n) pos <- t + ofs to N by t i = pos.toInt } while (tSeq(i) % t == 0) tSeq(i) /= t println(2 to N count {n => tSeq(n) == nToT(n)}) } }