#include <bits/stdc++.h>
using namespace std;
int const LOGN = 21;
int const N = 1 << LOGN;
double const PI = acos(-1);
complex<double> w[N + 5];
int bitrev[N + 5];
void fft(complex<double> *a) {
  for (int i = 0; i < N; ++i)
    if (i < bitrev[i]) swap(a[i], a[bitrev[i]]);
  for (int len = 2; len <= N; len *= 2) {
    int s = N / len;
    for (int i = 0; i < N; i += len) {
      for (int q = 0, j = i, k = i + len / 2; k < i + len; q += s, ++j, ++k) {
        auto cur = w[q] * a[k];
        a[k] = a[j] - cur;
        a[j] += cur;
      }
    }
  }
}
int main() {
  {
    for (int i = 0; i < N; ++i) {
      double a = 2 * PI * i / N;
      w[i] = complex<double>(cos(a), sin(a));
    }
    bitrev[0] = 0;
    for (int i = 1; i < N; ++i) {
      bitrev[i] = bitrev[i >> 1] >> 1 | (i & 1) << (LOGN - 1);
    }
  }
  int n, m;
  scanf("%d%d", &n, &m);
  static int used[N + 5];
  static complex<double> p[N + 5];
  for (int i = 0; i < n; ++i) {
    int x;
    scanf("%d", &x);
    p[x] = double(1);
    used[x] = 1;
  }
  fft(p);
  for (int i = 0; i < N; ++i) {
    p[i] = conj(p[i] * p[i]);
  }
  fft(p);
  for (int i = 0; i < N; ++i) {
    p[i] /= double(N);
  }
  for (int i = 0; i <= m; ++i) {
    if (real(p[i]) > 0.5) {
      if (!used[i]) {
        cout << "NO\n";
        return 0;
      }
      used[i] = false;
    }
  }
  vector<int> ans;
  for (int i = 0; i < N; ++i) {
    if (used[i]) {
      ans.push_back(i);
    }
  }
  cout << "YES\n";
  cout << ans.size() << '\n';
  for (int x : ans) {
    cout << x << ' ';
  }
  cout << '\n';
}
