#include <bits/stdc++.h>
using namespace std;
template <class T>
ostream &operator<<(ostream &out, vector<T> v) {
  for (T x : v) out << fixed << setprecision(8) << x << ' ';
  return out;
}
template <class C, class T>
void FFT(C &a, T root, bool inv, int n = -1) {
  if (n == -1) n = ((int)(a).size());
  int k = 0;
  while ((1 << k) < n) k++;
  assert((1 << k) == n);
  int *rev = new int[n];
  rev[0] = 0;
  for (int i = (int)(1); i < ((int)n); i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (k - 1));
  for (int i = 0; i < (int)(n); i++)
    if (rev[i] < i) swap(a[i], a[rev[i]]);
  T *r = new T[k];
  if (inv) root = T(1) / root;
  r[k - 1] = root;
  for (int i = (int)(k - 1) - 1; i >= ((int)0); i--) r[i] = r[i + 1] * r[i + 1];
  for (int l = 0; l < (int)(k); l++) {
    int step = 1 << l;
    for (int i = 0; i < n; i += 2 * step) {
      T ri = 1;
      for (int j = i; j < i + step; j++) {
        T val = ri * a[j + step];
        a[j + step] = a[j] - val;
        a[j] += val;
        ri *= r[l];
      }
    }
  }
  if (inv) {
    T invn = T(1) / T(n);
    for (int i = 0; i < (int)(n); i++) a[i] *= invn;
  }
  delete[] rev;
  delete[] r;
}
const int N = 1e6 + 10;
const double PI = acos(-1);
int n, m, a[N];
vector<complex<double> > convolution(vector<complex<double> > a,
                                     vector<complex<double> > b) {
  int n = ((int)(a).size());
  auto root = exp(complex<double>(0, 2 * PI / n));
  FFT(a, root, 0);
  FFT(b, root, 0);
  for (int i = 0; i < (int)(n); i++) a[i] *= b[i];
  FFT(a, root, 1);
  return a;
}
template <class T>
void print(vector<T> a) {
  for (auto x : a) cerr << (abs(x) > 0.5);
  cerr << endl;
}
vector<bool> conv(const vector<complex<double> > &a) {
  int n = ((int)(a).size());
  vector<bool> res(n);
  for (int i = 0; i < (int)(n); i++) res[i] = abs(a[i]) > .5;
  return res;
}
int main() {
  scanf("%d %d", &n, &m);
  int om;
  m += 2;
  om = m;
  for (int i = 0; i < (int)(n); i++) scanf("%d", a + i);
  {
    int k;
    for (k = 0; (1 << k) < m; k++)
      ;
    m = 1 << (k + 1);
  }
  vector<complex<double> > ones(m);
  for (int i = 0; i < (int)(n); i++) ones[a[i]] = 1;
  auto sum = convolution(ones, ones);
  auto p = conv(ones), p2 = conv(sum);
  bool good = true;
  vector<int> res;
  for (int i = 0; i < (int)(om - 1); i++) {
    if (p2[i] && !p[i]) good = false;
    if (p[i] && !p2[i]) res.push_back(i);
  }
  if (!good)
    printf("NO\n");
  else {
    printf("YES\n%d\n", ((int)(res).size()));
    for (auto x : res) printf("%d ", x);
  }
  return 0;
}
