#include <bits/stdc++.h>
using namespace std;
long long realmod(long long a, long long m) {
  a %= m;
  if (a < 0) a += m;
  return a;
}
long long gcd(long long a, long long b) { return !b ? a : gcd(b, a % b); }
void extend_gcd(long long a, long long b, long long &x, long long &y,
                long long &d) {
  if (!b) {
    d = a;
    x = 1;
    y = 0;
  } else {
    extend_gcd(b, a % b, y, x, d);
    y -= x * (a / b);
  }
}
long long linear_solve(long long a, long long b, long long m) {
  long long x, y, d;
  extend_gcd(a, m, x, y, d);
  if (b % d)
    return -1;
  else
    return realmod(b / d * x, m);
}
bool linear_merge(long long a1, long long m1, long long a2, long long m2,
                  long long &a, long long &m) {
  long long d = gcd(m1, m2);
  if ((a2 - a1) % d) return false;
  long long km = linear_solve(m1 / d, (a2 - a1) / d, m2 / d);
  m = m1 / d * m2;
  a = realmod(a1 + km * m1, m);
  return true;
}
long long solve(long long n, long long *a, long long *m) {
  long long A = 0, M = 1;
  for (int i = 1; i <= n; i++) {
    if (!linear_merge(A, M, a[i], m[i], A, M)) return -1;
  }
  if (!A) A = M;
  return A;
}
const int SIZE = 10010;
long long N, M, K;
long long A[SIZE], B[SIZE];
long long R[SIZE];
bool work(void) {
  long long lcm = 1;
  for (long long i = 1; i <= K; i++) {
    long long g = gcd(lcm, A[i]);
    if (lcm / g > N / A[i]) return false;
    lcm = lcm / g * A[i];
    R[i] = 1 - i;
  }
  if (lcm > N || lcm <= 0) return false;
  long long a = solve(K, R, A);
  if (a < 0 || a + K - 1 > M) return false;
  for (long long i = 0; i < K; i++)
    if (gcd(lcm, a + i) != A[i + 1]) return false;
  return true;
}
void read(void) {
  cin >> N >> M >> K;
  for (int i = 1; i <= K; i++) cin >> A[i];
}
int main() {
  read();
  if (work())
    printf("YES\n");
  else
    printf("NO\n");
  return 0;
}
