#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 30;
void bit_reverse(vector<complex<double> >& a) {
  int n = a.size();
  for (int i = 1, j = n / 2; i < n - 1; ++i) {
    if (i < j) {
      swap(a[i], a[j]);
    }
    int k = n / 2;
    while (j >= k) {
      j -= k;
      k /= 2;
    }
    if (j < k) j += k;
  }
}
void fft(vector<complex<double> >& a, int flag) {
  int n = a.size();
  bit_reverse(a);
  vector<complex<double> > wn(n);
  for (int i = 0; i < n; ++i) {
    wn[i] = complex<double>{cos(flag * 2 * M_PI / n * i),
                            sin(flag * 2 * M_PI / n * i)};
  }
  for (int k = 2; k <= n; k <<= 1) {
    for (int i = 0; i < n; i += k) {
      int wi = 0, step = n / k;
      for (int j = i; j < i + k / 2; ++j) {
        complex<double> u = a[j];
        complex<double> v = wn[wi] * a[j + k / 2];
        a[j] = u + v;
        a[j + k / 2] = u - v;
        wi += step;
      }
    }
  }
  if (flag < 0) {
    for (int i = 0; i < n; ++i) {
      a[i] /= n;
    }
  }
}
int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  int len = 1;
  while (len < 2 * m + 1) len <<= 1;
  vector<complex<double> > a(len);
  vector<int> b(m + 1);
  a[0] = 1;
  for (int i = 0; i < n; ++i) {
    int x;
    scanf("%d", &x);
    a[x] = 1;
    b[x] = 1;
  }
  fft(a, 1);
  for (int i = 0; i < len; ++i) {
    a[i] *= a[i];
  }
  fft(a, -1);
  vector<int> ret;
  bool found = false;
  for (int i = 1; i <= m; ++i) {
    int x = (int)(a[i].real() + 0.5);
    if (x > 0 && b[i] == 0) {
      found = true;
      break;
    }
    if (x == 2) {
      ret.push_back(i);
    }
  }
  if (found) {
    puts("NO");
  } else {
    puts("YES");
    printf("%d\n", ret.size());
    for (int i = 0; i < ret.size(); ++i) {
      printf("%d%c", ret[i], " \n"[i == ret.size() - 1]);
    }
  }
  return 0;
}
