#include <bits/stdc++.h>
template <typename T>
inline bool chkmin(T &a, T b) {
  return b < a ? a = b, true : false;
}
template <typename T>
inline bool chkmax(T &a, T b) {
  return b > a ? a = b, true : false;
}
template <class T>
inline T read(T &x) {
  int sign = 1;
  char c = getchar_unlocked();
  for (; !isdigit(c); c = getchar_unlocked())
    if (c == '-') sign = -1;
  for (x = 0; isdigit(c); c = getchar_unlocked()) x = x * 10 + c - '0';
  return x *= sign;
}
template <class T>
inline void write(T x) {
  if (x == 0) {
    putchar_unlocked('0');
    return;
  }
  if (x < 0) {
    putchar_unlocked('-');
    x = -x;
  }
  static char s[20];
  int top = 0;
  for (; x; x /= 10) s[++top] = x % 10 + '0';
  while (top) putchar_unlocked(s[top--]);
}
const int maxN = 4e6 + 100;
const double pi = acos(-1.);
struct Complex {
  double real, imag;
  Complex(double real = 0, double imag = 0) : real(real), imag(imag) {}
  inline friend Complex operator+(const Complex &a, const Complex &b) {
    return Complex(a.real + b.real, a.imag + b.imag);
  }
  inline friend Complex operator-(const Complex &a, const Complex &b) {
    return Complex(a.real - b.real, a.imag - b.imag);
  }
  inline friend Complex operator*(const Complex &a, const Complex &b) {
    return Complex(a.real * b.real - a.imag * b.imag,
                   a.real * b.imag + a.imag * b.real);
  }
};
Complex a[maxN], A[maxN];
int p[maxN], P[maxN], T[maxN];
int rev[maxN];
void FFT(Complex *a, int N, int flag) {
  for (int i = 0; i < N; ++i)
    if (i < rev[i]) std::swap(a[i], a[rev[i]]);
  for (int k = 1; k < N; k <<= 1) {
    Complex wn(cos(pi / k), sin(flag * pi / k));
    for (int i = 0; i < N; i += (k << 1)) {
      Complex w(1, 0);
      for (int j = 0; j < k; ++j) {
        Complex x = a[i + j];
        Complex y = a[i + j + k] * w;
        a[i + j] = x + y;
        a[i + j + k] = x - y;
        w = w * wn;
      }
    }
  }
  if (flag == -1) {
    for (int i = 0; i < N; ++i) a[i].real /= N;
  }
}
int main() {
  if (fopen("tmp.in", "r")) {
    freopen("tmp.in", "r", stdin);
    freopen("tmp.out", "w", stdout);
  }
  int n, m;
  read(n), read(m);
  for (int i = 1; i <= n; ++i) read(p[i]), T[p[i]] = 1;
  int N, STEP;
  for (N = 1, STEP = 0; N < m + m; N <<= 1, ++STEP)
    ;
  for (int i = 0; i < N; ++i)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (STEP - 1));
  for (int i = 1; i <= n; ++i) a[p[i]] = 1;
  FFT(a, N, 1);
  for (int i = 0; i < N; ++i) A[i] = a[i] * a[i];
  FFT(A, N, -1);
  for (int i = 0; i < N; ++i) P[i] = int(A[i].real + 0.5);
  static int ans[maxN];
  int ans0 = 0;
  for (int i = 1; i <= m; ++i) {
    if (T[i] == 1 && P[i] == 0) ans[++ans0] = i;
    if (T[i] == 0 && P[i]) {
      puts("NO");
      return 0;
    }
  }
  puts("YES");
  write(ans0), putchar_unlocked('\n');
  for (int i = 1; i <= ans0; ++i) write(ans[i]), putchar_unlocked(' ');
  return 0;
}
