#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e6 + 5;
const int MOD = 1e9 + 7;
int opt, ans = 1, low[MAXN], vis[MAXN], mx[MAXN], cnt[MAXN], dat[MAXN];
inline int read() {
  int x = 0;
  char ch = getchar();
  while (!isdigit(ch)) ch = getchar();
  while (isdigit(ch)) {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x;
}
template <typename T1, typename T2>
inline void Max(T1 &x, T2 y) {
  if (x < y) x = y;
}
inline int qpow(int x, int y) {
  long long r = 1, k = x;
  while (y) {
    if (y & 1) r *= k, r %= MOD;
    k *= k, k %= MOD, y >>= 1;
  }
  return r;
}
inline void update(int p, int x) {
  if (x > mx[p])
    mx[p] = x, cnt[p] = 1;
  else if (x == mx[p])
    cnt[p]++;
}
inline int check(int x) {
  while (x != 1) {
    int p = low[x], c = 0;
    while (x % p == 0) x /= p, c++;
    if (c == mx[p] && cnt[p] == 1) return 0;
  }
  return 1;
}
int main() {
  int n = read(), m = 0;
  for (int i = 1; i <= n; i++) Max(m, dat[i] = read());
  sort(dat + 1, dat + n + 1);
  for (int i = 2; i <= m; i++)
    if (!low[i])
      for (int j = i; j <= m; j += i)
        if (!low[j]) low[j] = i;
  for (int i = n; i; i--) {
    int v = dat[i];
    if (!mx[v])
      update(v, 1), ans = 1ll * ans * v % MOD;
    else {
      vis[i] = 1, v--;
      while (v != 1) {
        int p = low[v], c = 0;
        while (v % p == 0) v /= p, c++;
        if (c > mx[p]) {
          ans = 1ll * ans * qpow(p, c - mx[p]) % MOD;
          mx[p] = c, cnt[p] = 1;
        } else if (c == mx[p])
          cnt[p]++;
      }
    }
  }
  for (int i = 1; i <= n; i++) opt |= (vis[i] && check(dat[i] - 1));
  printf("%d\n", ans + opt);
  return 0;
}
