#include <bits/stdc++.h>
using namespace std;
template <class T>
void checkMin(T& x, const T v) {
  if (x > v) {
    x = v;
  }
}
template <class T>
void checkMax(T& x, const T v) {
  if (x < v) {
    x = v;
  }
}
template <class intType>
intType ext_gcd(intType a, intType b, intType& x, intType& y) {
  if (b == 0) {
    x = 1;
    y = 0;
    return a;
  }
  intType d = ext_gcd(b, a % b, y, x);
  y -= a / b * x;
  return d;
}
template <class intType>
intType mulMod(intType a, intType b, intType mod) {
  a %= mod, b %= mod;
  if (a < 0) a += mod;
  if (b < 0) b += mod;
  intType ret = 0;
  for (; b; b >>= 1) {
    if (b & 1) {
      ret += a;
      if (ret > mod) {
        ret -= mod;
      }
    }
    a += a;
    if (a > mod) {
      a -= mod;
    }
  }
  return ret;
}
template <class intType>
bool chineseRemainder(intType r1, intType m1, intType r2, intType m2,
                      intType& remainder, intType& mod) {
  intType x, y;
  intType d = ext_gcd(m1, m2, x, y);
  mod = m1 / d * m2;
  if ((r2 - r1) % d != 0) {
    return false;
  }
  x = mulMod((r2 - r1) / d, x, m2) * m1;
  x += r1;
  x %= mod;
  if (x < 0) {
    x += mod;
  }
  remainder = x;
  return true;
}
long long n, m, nk;
long long v;
vector<long long> a;
bool go() {
  long long x = 0, mod = 1, d;
  long long tx, ty;
  for (int n___LINE__ = nk, i = 0; i < n___LINE__; ++i) {
    d = ext_gcd(mod, a[i], tx, ty);
    if (mod / d > n / a[i]) {
      return false;
    }
    if (!chineseRemainder(x, mod, (a[i] - i % a[i]) % a[i], a[i], x, mod)) {
      return false;
    }
  }
  if (x == 0) x = mod;
  if (x + nk - 1 > m) return false;
  for (int n___LINE__ = nk, i = 0; i < n___LINE__; ++i) {
    if (ext_gcd(x + i, mod, tx, ty) != a[i]) {
      return false;
    }
  }
  return true;
}
int main() {
  cin >> n >> m >> nk;
  for (int n___LINE__ = nk, i = 0; i < n___LINE__; ++i) {
    cin >> v;
    a.push_back(v);
  }
  puts(go() ? "YES" : "NO");
  return 0;
}
