#include <bits/stdc++.h>
using namespace std;
const int INF = ((long long)1E9 + 7);
template <class C>
void mini(C &a, C b) {
  a = min(a, b);
}
template <class C>
void maxi(C &a, C b) {
  a = max(a, b);
}
const int MN = 21;
complex<long double> omega[1 << MN];
const double PI = std::atan(1.0) * 4;
void fft(vector<complex<long double> > &a, int n, bool inverse = false) {
  int N = 1 << n;
  a.insert(a.end(), N - ((int)(a).size()), 0);
  if (inverse)
    for (int i = (0); i <= (N - 1); ++i)
      omega[i] = polar((long double)1.0, -2 * PI * (long double)i / N);
  else
    for (int i = (0); i <= (N - 1); ++i)
      omega[i] = polar((long double)1.0, 2 * PI * (long double)i / N);
  for (int i = 0; i < (n); ++i) {
    for (int j = 0; j < (1 << i); ++j) {
      for (int k = 0; k < (1 << (n - i - 1)); ++k) {
        int s = (j << (n - i)) + k;
        int t = s + (1 << (n - i - 1));
        complex<long double> temp = a[s] + a[t];
        a[t] = omega[k << i] * (a[s] - a[t]);
        a[s] = temp;
      }
    }
  }
  for (int i = 0; i < (N); ++i) {
    int x = i, y = 0;
    for (int j = 0; j < (n); ++j) y = (y << 1) + (x & 1), x >>= 1;
    if (i < y) swap(a[i], a[y]);
  }
  if (inverse) {
    complex<long double> inv =
        complex<long double>((long double)1 / N, (long double)0);
    for (int i = 0; i < (N); ++i) a[i] = a[i] * inv;
  }
}
vector<complex<long double> > conv(vector<complex<long double> > A,
                                   vector<complex<long double> > B) {
  int n = 31 - __builtin_clz(2 * (((int)(A).size()) + ((int)(B).size())) - 1);
  fft(A, n);
  fft(B, n);
  for (int i = 0; i < ((1 << n)); ++i) A[i] = A[i] * B[i];
  fft(A, n, true);
  return A;
}
vector<complex<long double> > square(vector<complex<long double> > A) {
  int n = 32 - __builtin_clz(2 * ((int)(A).size()) - 1);
  fft(A, n);
  for (int i = 0; i < ((1 << n)); ++i) A[i] = A[i] * A[i];
  fft(A, n, true);
  return A;
}
const long double EPS = 1e-10;
int main() {
  ios_base::sync_with_stdio(false);
  int n, m;
  scanf("%d%d", &n, &m);
  vector<int> A(m + 1);
  for (int i = 0; i < (n); ++i) {
    int a;
    scanf("%d", &a);
    A[a] = 1;
  }
  vector<complex<long double> > a;
  for (__typeof((A).begin()) it = ((A).begin()); it != (A).end(); ++it)
    a.push_back(complex<long double>(*it, 0));
  vector<complex<long double> > b = square(a);
  vector<int> B;
  for (__typeof((b).begin()) it = ((b).begin()); it != (b).end(); ++it)
    B.push_back((int)round(it->real()));
  int cnt = 0;
  for (int i = 0; i < (m + 1); ++i) {
    if (B[i] > 0 && A[i] == 0) {
      printf("NO\n");
      return 0;
    }
    if (B[i] == 0 && A[i] == 1) {
      ++cnt;
    }
  }
  printf("YES\n%d\n", cnt);
  for (int i = 0; i < (m + 1); ++i) {
    if (B[i] == 0 && A[i] == 1) {
      printf("%d ", i);
    }
  }
  printf("\n");
  return 0;
}
