#include <bits/stdc++.h>
std::string Name = "<stdin>";
std::string iput = Name.substr(0, Name.length() - 4) + ".in";
std::string oput = Name.substr(0, Name.length() - 4) + ".out";
template <class T>
inline bool chkmin(T &x, T y) {
  return x > y ? x = y, true : false;
}
template <class T>
inline bool chkmax(T &x, T y) {
  return x < y ? x = y, true : false;
}
template <class T>
inline T &read(T &x) {
  static int f;
  static char c;
  for (f = 1; !isdigit(c = getchar_unlocked());) {
    if (c == '-') f = -1;
  }
  for (x = 0; isdigit(c); c = getchar_unlocked()) {
    x = x * 10 + c - 48;
  }
  return x *= f;
}
template <class T>
inline void write(T x, const char p = '\n') {
  static int top;
  static int s[30];
  if (x < 0) {
    x = -x;
    putchar_unlocked('-');
  }
  do s[++top] = x % 10 + 48;
  while (x /= 10);
  while (top) putchar_unlocked(s[top--]);
  putchar_unlocked(p);
}
const int Log = 21;
const int maxn = 5e6;
const int N = 1 << 21;
const double pi = acos(-1.0);
struct Complex {
  double x, y;
  Complex(double x = 0, double y = 0) : x(x), y(y) {}
  Complex operator+(const Complex &a) const {
    return Complex(x + a.x, y + a.y);
  }
  Complex operator-(const Complex &a) const {
    return Complex(x - a.x, y - a.y);
  }
  Complex operator*(const Complex &a) const {
    return Complex(x * a.x - y * a.y, y * a.x + x * a.y);
  }
};
int rev[maxn];
void DFT(Complex a[], 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 one(cos(pi / k), flag * sin(pi / k));
    for (int i = 0; i < N; i += 2 * k) {
      Complex now(1.0, 0.0);
      for (int j = 0; j < k; ++j) {
        Complex x = a[i + j];
        Complex y = a[i + k + j] * now;
        a[i + j] = x + y;
        a[i + k + j] = x - y;
        now = now * one;
      }
    }
  }
  if (flag != -1) return;
  for (int i = 0; i < N; ++i) {
    a[i].x /= N;
  }
}
bool vis[maxn];
bool vis2[maxn];
Complex a[maxn];
void FFT() {
  for (int i = 0; i < N; ++i) {
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (Log - 1));
  }
  DFT(a, 1);
  for (int i = 0; i < N; ++i) {
    a[i] = a[i] * a[i];
  }
  DFT(a, -1);
  for (int i = 0; i < N; ++i) {
    if (round(a[i].x) > 0) vis2[i] = true;
  }
}
int n;
int m;
void exec() {
  read(n);
  read(m);
  for (int i = 1, x; i <= n; ++i) {
    read(x);
    a[x].x = 1.0;
    vis[x] = true;
  }
  FFT();
  static std::queue<int> ans;
  for (int i = 1; i <= m; ++i) {
    if (vis[i] && !vis2[i]) ans.push(i);
    if (!vis[i] && vis2[i]) puts("NO"), exit(0);
  }
  puts("YES");
  write(ans.size());
  while (!ans.empty()) {
    write(ans.front(), ' ');
    ans.pop();
  }
}
int main() {
  if (fopen(iput.c_str(), "r") != NULL) {
    freopen(iput.c_str(), "r", stdin);
    freopen(oput.c_str(), "w", stdout);
  }
  exec();
  fclose(stdin);
  fclose(stdout);
  return 0;
}
