#include <bits/stdc++.h>
const long double eps = 1e-9;
using namespace std;
template <class T>
inline T MAX(const T &_a, const T &_b) {
  return ((_a > _b) ? _a : _b);
}
template <class T>
inline T MIN(const T &_a, const T &_b) {
  return ((_a < _b) ? _a : _b);
}
template <class T>
inline T MAX3(const T &_a, const T &_b, const T &_c) {
  return MAX(MAX(_a, _b), _c);
}
template <class T>
inline T MIN3(const T &_a, const T &_b, const T &_c) {
  return MIN(MIN(_a, _b), _c);
}
template <class T>
inline T MAX4(const T &_a, const T &_b, const T &_c, const T &_d) {
  return MAX(MAX3(_a, _b, _c), _d);
}
template <class T>
inline T MIN4(const T &_a, const T &_b, const T &_c, const T &_d) {
  return MIN(MIN3(_a, _b, _c), _d);
}
template <class T>
inline T ABS(const T &_a) {
  return ((_a < 0) ? -_a : _a);
}
template <class T>
inline T SQR(const T &_a) {
  return _a * _a;
}
template <class T>
inline T gcd(T _a, T _b) {
  for (T _r; (_r = _a % _b); _b = _r) _a = _b;
  return _b;
}
template <class T>
inline T lcm(const T &_a, const T &_b) {
  return (_a / gcd(_a, _b)) * _b;
}
template <class T>
inline bool BETW(const T &_a, const T &_b, const T &_c) {
  return (_a >= MIN(_b, _c) && _a <= MAX(_b, _c));
}
template <class T>
inline bool EXT(const T &_a, const T &_b, const T &_c) {
  return !BETW(_a, _b, _c);
}
const int MAXV = 2000010;
int V[200010], p[MAXV];
inline void scan(int &_x) {
  register int _c = getchar();
  _x = 0;
  while (_c < 48 || _c > 57) _c = getchar();
  for (; _c > 47 && _c < 58; _c = getchar()) _x = _x * 10 + _c - 48;
}
int main() {
  int N, i, j, ans = 0;
  scan(N);
  for (i = 0; i < N; ++i) scan(V[i]);
  sort(V, V + N);
  N = unique(V, V + N) - V;
  for (i = 1, j = 0; i < MAXV; ++i) {
    while (j < N && V[j] < i) ++j;
    p[i] = j - 1;
  }
  for (i = 0; i < N; ++i)
    for (j = 2 * V[i]; j < MAXV; j += V[i]) ans = MAX(ans, V[p[j]] % V[i]);
  printf("%d\n", ans);
  return 0;
}
