Problem:
Problem D : Numbers

n が与えられるので、n 個の連続した正の整数を求めよ。
ただしすべての数が、１とその数自身以外の約数をもたなくてはならない。

Input

入力は以下のフォーマットで与えられる。

n

入力は以下の制約を満たす。

1 ≤ n ≤ 1,500

Output

最初の行に、あなたが選んだ連続したn 個の正の整数の中で一番小さいものを出力せよ。

2行目からn+1 行目に、それぞれの値に対する約数を出力せよ。

約数は1かその数自身でなければどの値を出力しても良い。

1行目に出力した数をxとして、i行目には x+i-2 の約数を出力せよ。

出力する値は5,000桁を超えてはいけない。

Sample Input 1

2

Sample Output 1

8
2
3

Sample Input 2

3

Sample Output 2

8
2
3
5

Hint

Sample Output 2では、8,9,10を3個の連続した整数として選んでいる。

2行目に、8の約数として2,3行目は9の約数として3,４行目には10の約数として5,を出力している。

Solution in Scala (judge verdict: Accepted)

import java.util.Scanner

import scala.collection.Searching._
import scala.annotation.tailrec
import scala.collection.immutable.{NumericRange, Queue}
import scala.collection.mutable
import scala.io.StdIn.readLine

class IUnionFind(val size: Int) {

  private case class Node(var parent: Option[Int], var treeSize: Int)

  private val nodes = Array.fill[Node](size)(new Node(None, 1))

  def union(t1: Int, t2: Int): IUnionFind = {
    if (t1 == t2) return this

    val root1 = root(t1)
    val root2 = root(t2)
    if (root1 == root2) return this

    val node1 = nodes(root1)
    val node2 = nodes(root2)

    if (node1.treeSize < node2.treeSize) {
      node1.parent = Some(t2)
      node2.treeSize += node1.treeSize
    } else {
      node2.parent = Some(t1)
      node1.treeSize += node2.treeSize
    }
    this
  }

  def connected(t1: Int, t2: Int): Boolean = t1 == t2 || root(t1) == root(t2)

  @tailrec
  private def root(t: Int): Int = nodes(t).parent match {
    case None => t
    case Some(p) => root(p)
  }
}


object Main {
  def solve(sc: => Scanner): Unit = {
    val N = sc.nextInt
    val begin = (BigInt(1) to N + 2).product - N - 1
    println(begin)
    for (i <- Range(0, N)) {
      println(N - i + 1)
    }
  }

  def gcd(i: Long, j: Long): Long = {
    if (i < j) (gcd(j, i)) else (if (j == 0) (i) else (gcd(j, i % j)))
  }

  def main(args: Array[String]): Unit = {
    val sc: Scanner = new Scanner(System.in)
    solve(sc)
  }
}