#include <bits/stdc++.h>
using namespace std;
const int maxprime = 1e7 + 2, up = sqrt(maxprime);
int prime[maxprime];
inline void sieve() {
  for (int i = 0; i < maxprime; i++) prime[i] = i;
  for (int i = 2; i < maxprime; i += 2) prime[i] = 2;
  for (int i = 3; i <= up; i += 2) {
    if (prime[i] != i) continue;
    int lim = i * i;
    int add = 2 * i;
    for (int j = lim; j < maxprime; j += add) {
      if (prime[j] == j) prime[j] = i;
    }
  }
}
int freq[maxprime], tmp, k;
long long occ[maxprime], ans = 1;
long long bsrch(long long l, long long r, int v) {
  if (l == r) return l;
  long long mid = (l + r) / 2, tmp = mid, tot = 0;
  while (tmp) {
    tmp /= v;
    tot += tmp;
  }
  if (tot >= occ[v])
    return bsrch(l, mid, v);
  else
    return bsrch(mid + 1, r, v);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  sieve();
  cin >> k;
  for (int i = 0; i < k; i++) {
    cin >> tmp;
    freq[1]++;
    freq[tmp + 1]--;
  }
  for (int i = 1; i < maxprime; i++) freq[i] += freq[i - 1];
  for (int i = 2; i < maxprime; i++) {
    if (freq[i] == 0) break;
    tmp = i;
    while (tmp > 1) {
      k = prime[tmp];
      while (tmp % k == 0) {
        tmp /= k;
        occ[k] += freq[i];
      }
    }
  }
  for (int i = 2; i < maxprime; i++) {
    if (occ[i] == 0) continue;
    ans = max(ans, bsrch(1, 1e13, i));
  }
  cout << ans;
  return 0;
}
