#include <bits/stdc++.h>
using namespace std;
using cd = complex<double>;
using vc = vector<cd>;
double const PI = acos(-1.0);
double const eps = 1e-5;
int const N = 1e6 + 10;
vc a;
bool has[N];
int out[N];
inline bool is_0(const double x) { return fabs(x) < eps; }
void fft(vc &a, bool inv) {
  int n = (int)a.size(), nb = __builtin_ctz(n);
  assert((n & (n - 1)) == 0);
  for (int i = 0, j, k; i < n; ++i) {
    for (j = k = 0; k < nb; ++k)
      if (i & 1 << k) j |= 1 << (nb - k - 1);
    if (i < j) swap(a[i], a[j]);
  }
  for (int step = 2; step <= n; step <<= 1) {
    cd r = exp(2 * PI / step * cd(0, inv ? -1 : 1));
    for (int i = 0; i < n; i += step) {
      cd w(1, 0);
      for (int j = 0; j < step / 2; ++j) {
        cd x = a[i + j], y = w * a[i + j + step / 2];
        a[i + j] = x + y, a[i + j + step / 2] = x - y;
        w *= r;
      }
    }
  }
  if (inv)
    for (int i = 0; i < n; ++i) a[i] /= n;
}
void sqr(vc &a) {
  fft(a, false);
  for (auto &c : a) c *= c;
  fft(a, true);
}
int main() {
  int n, m, sz = 1;
  scanf("%d%d", &n, &m);
  for (; sz < 2 * m; sz <<= 1)
    ;
  a.resize(sz);
  for (int i = 0, k; i < n; ++i) {
    scanf("%d", &k);
    a[k] = 1, has[k] = true;
  }
  a[0] = 1;
  sqr(a);
  sz = 0;
  for (int i = 1; i <= m; ++i)
    if (!is_0(a[i].real()) && !has[i]) return puts("NO"), 0;
  for (int i = 1; i <= m; ++i)
    if (is_0(a[i].real() - 2)) out[sz++] = i;
  puts("YES");
  printf("%d\n", sz);
  for (int i = 0; i < sz; ++i) printf("%d%s", out[i], i == sz - 1 ? "\n" : " ");
  return 0;
}
