#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:16777216")
using namespace std;
const double eps = 1e-9;
const double pi = acos(-1.0);
const int maxn = (int)1e4 + 10;
long long a[maxn], v[maxn], b[maxn];
long long gcd(long long A, long long B) {
  A = abs(A);
  B = abs(B);
  while (B != 0) {
    A %= B;
    swap(A, B);
  }
  return A;
}
bool gcdEx(long long A, long long &X, long long B, long long &Y, long long C) {
  long long lastX = 0;
  long long lastY = 1;
  X = 1;
  Y = 0;
  while (B != 0) {
    long long sub = A / B;
    X -= lastX * sub;
    Y -= lastY * sub;
    A -= B * sub;
    swap(A, B);
    swap(X, lastX);
    swap(Y, lastY);
  }
  if (C % A != 0) return false;
  X *= C / A;
  Y *= C / A;
  return true;
}
int main() {
  long long n, m;
  int k;
  cin >> n >> m >> k;
  long long lcm = 1;
  for (int i = 0; i < k; i++) {
    cin >> a[i];
    b[i] = a[i];
    long long g = gcd(lcm, a[i]);
    if (a[i] / g > n / lcm) {
      puts("NO");
      return 0;
    }
    lcm = a[i] / g * lcm;
  }
  for (int i = 0; i < k; i++) {
    v[i] = (-i % a[i] + a[i]) % a[i];
  }
  for (int i = 0; i < k - 1; i++) {
    long long A = a[i];
    long long B = -a[i + 1];
    long long C = v[i + 1] - v[i];
    long long G = gcd(A, B);
    long long x, y;
    if (!gcdEx(A, x, B, y, C)) {
      puts("NO");
      return 0;
    }
    assert(A * x + B * y == C);
    long long X = (long long)1e18;
    if (x < 0) {
      long long add = (-x - B / G - 1) / (-B / G);
      x += add * (-B / G);
      y -= add * (-A / G);
    }
    long long sub = x / (-B / G);
    x -= sub * (-B / G);
    y += sub * (-A / G);
    if (y >= 0) {
      X = min(X, a[i] * x + v[i]);
    }
    if (y < 0) {
      long long add = (-y + A / G - 1) / (A / G);
      y += add * (A / G);
      x -= add * (B / G);
    }
    if (y >= 0) {
      long long sub = y / (A / G);
      y -= sub * (A / G);
      x += sub * (B / G);
    }
    if (x >= 0) {
      X = min(X, a[i + 1] * y + v[i + 1]);
    }
    if (X == (long long)1e18) {
      puts("NO");
      return 0;
    }
    if (X > m - k + 1) {
      puts("NO");
      return 0;
    }
    assert(X % a[i + 1] == v[i + 1]);
    a[i + 1] = a[i] / gcd(a[i], a[i + 1]) * a[i + 1];
    v[i + 1] = X;
  }
  long long X = v[k - 1];
  if (X == 0) X = a[k - 1];
  if (X > m - k + 1) {
    puts("NO");
    return 0;
  }
  for (int i = 0; i < k; i++) {
    if (gcd(lcm, X + i) != b[i]) {
      puts("NO");
      return 0;
    }
  }
  puts("YES");
  return 0;
}
