6倍まで桁上りがあってはいけないので、[1, 10 / 6)を10のべき乗で掛けた数になります。あとは、各倍数の10進の数字をソートして比較するだけです。
import scala.testing.Benchmark def pow(n :Int, e :Int) = (1 to e).foldLeft(1)((x, y) => x * n) def digits(n :Int) :List[Int] = if(n == 0) Nil else (n % 10) :: digits(n / 10) def is_solution(n :Int) :Boolean = { val it_m = Iterator.range(1, M + 1).map(n *). map(m => digits(m).sortWith(_ < _)) val ds1 = it_m.next it_m.forall(ds1 ==) } def gen_solutions(N :Int) = { val begin = pow(10, N - 1) val end = (pow(10, N) - 1) / M + 1 Iterator.range(begin, end).filter(is_solution) } def solve() = { println (Iterator.from(6).flatMap(gen_solutions).take(5).toList) } object Test extends Benchmark { def run() = solve } val M = 6 println (Test.runBenchmark(10))