Problem:
Score : 300 points

Problem Statement

There are N integers, A_1, A_2, ..., A_N, written on the blackboard.

You will choose one of them and replace it with an integer of your choice between 1 and 10^9 (inclusive), possibly the same as the integer originally written.

Find the maximum possible greatest common divisor of the N integers on the blackboard after your move.

Constraints

All values in input are integers.

2 \leq N \leq 10^5

1 \leq A_i \leq 10^9

Output

Input is given from Standard Input in the following format:

N
A_1 A_2 ... A_N

Output

Print the maximum possible greatest common divisor of the N integers on the blackboard after your move.

Sample Input 1

3
7 6 8

Sample Output 1

2

If we replace 7 with 4, the greatest common divisor of the three integers on the blackboard will be 2, which is the maximum possible value.

Sample Input 2

3
12 15 18

Sample Output 2

6

Sample Input 3

2
1000000000 1000000000

Sample Output 3

1000000000

We can replace an integer with itself.

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.*;

public class Main {
	int N;
	long[] A;
	long result = 0;

	long gcd(long large, long small) {
		if (large < small) {
			return gcd(small, large);
		}
		if (large == small) {
			return large;
		}
		if (large % small == 0) {
			return small;
		}
		return gcd(small, large % small);
	}

	void calc() {
		List<Long> gcds = new ArrayList<>();
		gcds.add(gcd(A[A.length - 1], A[A.length - 2]));
		int index = A.length - 2;
		for (int i = A.length - 3; i >= 0; --i) {
			long last = gcds.get(gcds.size() - 1);
			long g = gcd(last, A[i]);
			gcds.add(g);
			if (g < last) {
				index = i;
			}
		}

		if (index <= A.length - 3) {
			// その数を置き換える
			long r = A[A.length - 1];
			for (int i = A.length - 2; i >= 0; --i) {
				if (i == index) {
					continue;
				}
				r = gcd(r, A[i]);
			}
			this.result = r;
		} else {
			long r0 = A[A.length - 1];
			for (int i = A.length - 3; i >= 0; --i) {
				r0 = gcd(r0, A[i]);
			}
			long r1 = A[A.length - 2];
			for (int i = A.length - 3; i >= 0; --i) {
				r1 = gcd(r1, A[i]);
			}
			this.result = Math.max(r0, r1);
		}
	}

	Main() throws IOException {
		InputStreamReader reader = new InputStreamReader(System.in, StandardCharsets.UTF_8);
		BufferedReader in = new BufferedReader(reader);
		N = Integer.parseInt(in.readLine());
		A = new long[N];
		String[] tokens = in.readLine().split(" ");
		for (int i = 0; i < N; ++i) {
			A[i] = Integer.parseInt(tokens[i]);
		}
		in.close();
		Arrays.sort(A);
		calc();
	}

	public static void main(String[] args) throws IOException {
		Main ins = new Main();
		System.out.println(ins.result);
	}

}