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: Time Limit Exceeded)

import java.util.*;

public class Main{

    public static void main(String args[]){

        // スキャナーの宣言
        Scanner sc = new Scanner(System.in);
        // 整数の入力
		int n = sc.nextInt();
        int[] a = new int[n];
        //int min = Integer.MAX_VALUE;
        int num;//最大公約数
        a[0] = sc.nextInt();
        a[1] = sc.nextInt();
        int tmp;
        int x;
        int y;
        /*while ((tmp = x % y) != 0) {
            x = y;
            y = tmp;
        }
        num = y;*/
        //System.out.println(num);
        for(int i = 2; i < n; i++){
            a[i] = sc.nextInt();
            /*x = Math.max(num, a[i]);
            y = Math.min(num, a[i]);
            //min = Math.min(a[i], min);
            while ((tmp = x % y) != 0) {
                x = y;
                y = tmp;
            }
            num = y;*/
        }
        //System.out.println(num);
        int ans = 0;
        boolean b = true;
        /*for(int i = 1; i < min + 1; i++){
            for(int j = 0;j < n; j++){
                if(a[j] % i != 0) b = false;
            }
            if(b) ans = Math.max(i, ans);
            b = true;
        }*/
        /*for(int i = 0; i < n; i++){
            for(int j = 1; j < num + 1; j++){
                for(int k = 0; k < n; k++){
                    if(k != i && a[k] % j != 0){
                        b = false;
                        break;
                    }
                }
                if(b) ans = Math.max(j, ans);
                b = true;
            }
        }*/
        int l = 0;
        for(int i = 0; i < n; i++){
            if(n == 2){
                ans = Math.max(a[0], a[1]);
                break;
            }
            if(i != 0 && i != 1){
                x = Math.max(a[0], a[1]);
                y = Math.min(a[0], a[1]);
                while ((tmp = x % y) != 0) {
                    x = y;
                    y = tmp;
                }
                l = y;
            }else if(i == 0){
                x = Math.max(a[2], a[1]);
                y = Math.min(a[2], a[1]);
                while ((tmp = x % y) != 0) {
                    x = y;
                    y = tmp;
                }
                l = y;
            }else if(i == 1){
                x = Math.max(a[0], a[2]);
                y = Math.min(a[0], a[2]);
                while ((tmp = x % y) != 0) {
                    x = y;
                    y = tmp;
                }
                l = y;
            }
            for(int j = 2; j < n; j++){
                if(i != j){
                    x = Math.max(l, a[j]);
                    y = Math.min(l, a[j]);
                    while ((tmp = x % y) != 0) {
                        x = y;
                        y = tmp;
                    }
                    l = y;
                }
            }
            ans = Math.max(l, ans);
        }

        // 出力
        System.out.println(ans);

    }

}