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 C# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class ABC
{
    public static void Main()
    {
        int N = int.Parse(Console.ReadLine());
        int[] A = Console.ReadLine().Split().Select(int.Parse).ToArray();
        int[] gcd_primes = new int[100000];
        int[] prime = prime_109();
        int divided = -1;
        int[] eikyou = new int[N];
        long gcd = 1;
        int[] B = new int[N];
        A.CopyTo(B, 0);
        for (int j = 0; j < prime.Length; j++)
        {
            divided = -1;
            for (int i = 0; i < N; i++)
            {
                if (A[i] % prime[j] == 0)
                {
                    A[i] /= prime[j];
                    if (divided == -1)
                    {
                        divided = i;
                    }
                    else if (divided >= 0)
                    {
                        divided = -2;
                    }
                }

                
            }
            if (divided >= 0)
            {
                if (eikyou[divided] == 0) eikyou[divided] = 1;
                eikyou[divided] *= prime[j];
            }

            if (divided != -1)
            {
                //wareta
                gcd *= prime[j];
                j--;
            }

        }
        int max = 0;
        int maxindex = -1;
        for (int i = 0; i < N; i++)
        {
            if (eikyou[i] > max)
            {
                maxindex = i;
                max = eikyou[i];
            }
        }

        int output = B[0];
        if (maxindex == 0) output = B[1];
        for (int i = 1; i < N; i++)
        {
            if (maxindex == i) continue;
            output = gcd2(output, B[i]);
        }


    }



    public static int[] prime_109()
    {
        List<int> numbers = new List<int>();
        for (int i = 2; i < 100000; i++)
        {
            numbers.Add(i);
        }
        List<int> output = new List<int>();
        while (numbers.Count != 0)
        {
            int temp = numbers[0];
            numbers.RemoveAt(0);
            output.Add(temp);
            var d =numbers.Where(x => x % temp != 0);
            numbers = new List<int>(d);
        }
        return output.ToArray();

    }
    public struct boolint
    {
        public int integer;
        public bool check;
        public boolint(int i)
        {
            this.integer = i;
            this.check = false;
        }

    }

    public static int gcd2(int a, int b)
    {
        if (a % b == 0) return b;
        else return gcd2(b, a % b);

    }


}