#include <bits/stdc++.h>   using namespace std;   const int N = 100005;   int a[N], cnt[N];   int f[N], bj[N];   vector<int> d[N];   int n, mx;   long long ans;   void init(int n) {     for (int i = 1; i <= n; i++) f[i] = 1;     for (int i = 2; i <= n; i++) {       if (bj[i]) continue;       f[i] = -1;       for (int j = i * 2; j <= n; j += i) {         bj[j] = 1;         f[j] = (j % (i * i)) ? f[j] * -1 : 0;       }     }   }   int count(int x) {     int res = 0;     for (int i = 0; i < d[x].size(); i++) {       res += f[d[x][i]] * cnt[d[x][i]];     }     return res;   }   void add(int x, int v) {     for (int i = 0; i < d[x].size(); i++) {       cnt[d[x][i]] += v;     }   }   int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }   int main() {     scanf( %d , &n);     for (int i = 1; i <= n; i++) {       int x;       scanf( %d , &x);       a[x]++;       mx = max(mx, x);     }     ans = mx;     for (int i = 1; i <= mx; i++) {       for (int j = i; j <= mx; j += i) {         d[j].push_back(i);       }     }     init(mx);     for (int g = 1; g <= mx; g++) {       stack<int> st;       for (int i = mx / g; i >= 1; i--) {         if (!a[i * g]) continue;         int c = count(i);         while (c) {           if (gcd(i, st.top()) == 1) {             ans = max(ans, (long long)i * g * st.top());             c--;           }           add(st.top(), -1);           st.pop();         }         st.push(i);         add(i, 1);       }       while (!st.empty()) {         add(st.top(), -1);         st.pop();       }     }     printf( %lld , ans);     return 0;   }   