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 JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.Scanner;
import java.math.BigInteger;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		ArrayList<Integer> primes = new ArrayList<Integer>();
		final int MAX_SIZE = 100000;
		boolean[] sieve = new boolean[MAX_SIZE];
		sieve[0] = sieve[1] = true;
		int[] divisors = new int[n + 2];
		for(int i = 0; i < n + 2; ++i){ divisors[i] = 1; }
		int fixed = 0;
		for(int i = 2; i < MAX_SIZE; ++i){
			if(sieve[i]){ continue; }
			primes.add(i);
			for(int j = i; j < MAX_SIZE; j += i){
				if(j < n + 2 && divisors[j] == 1){
					++fixed;
					divisors[j] = i;
				}
				sieve[j] = true;
			}
			if(fixed >= n){ break; }
		}
		BigInteger base = BigInteger.valueOf(1);
		for(int i = 0; i < primes.size(); ++i){
			int p = primes.get(i).intValue();
			base = base.multiply(BigInteger.valueOf(p));
		}
		base = base.add(BigInteger.valueOf(2));
		System.out.println(base.toString(10));
		for(int i = 2; i < divisors.length; ++i){
			System.out.println(divisors[i]);
		}
	}
}