#include <bits/stdc++.h>
using namespace std;
template <class P, class Q>
inline P smin(P &a, Q b) {
  if (b < a) a = b;
  return a;
}
template <class P, class Q>
inline P smax(P &a, Q b) {
  if (a < b) a = b;
  return a;
}
char _;
int read() {
  int x;
  cin >> x;
  return x;
}
inline pair<double, double> operator-(const pair<double, double> &a,
                                      const pair<double, double> &b) {
  return pair<double, double>(a.first - b.first, a.second - b.second);
}
inline pair<double, double> operator+(const pair<double, double> &a,
                                      const pair<double, double> &b) {
  return pair<double, double>(a.first + b.first, a.second + b.second);
}
inline pair<double, double> operator*(const pair<double, double> &a,
                                      const pair<double, double> &b) {
  return pair<double, double>(a.first * b.first - a.second * b.second,
                              a.first * b.second + a.second * b.first);
}
const int N = 1 << 21, lg = 21;
int rev[N];
void FFT(pair<double, double> a[], bool inverse) {
  for (int i = 0, _n = (int)(N); i < _n; i++)
    if (rev[i] > i) swap(a[rev[i]], a[i]);
  double arg = acos(-1.0);
  for (int len = 2; len <= N; len <<= 1, arg /= 2) {
    pair<double, double> wn =
        pair<double, double>(cos(arg), inverse == 0 ? sin(arg) : -sin(arg));
    for (int j = 0; j < N; j += len) {
      pair<double, double> w = pair<double, double>(1, 0);
      for (int x = j, y = j + len / 2; y < j + len; ++x, ++y) {
        pair<double, double> u = a[x], v = a[y] * w;
        a[x] = u + v;
        a[y] = u - v;
        w = w * wn;
      }
    }
  }
  if (inverse)
    for (int i = 0, _n = (int)(N); i < _n; i++) a[i].first /= N;
}
pair<double, double> a[N], b[N];
int mark[N], res[N], k, pt = 0;
void gen(int bit = lg - 1, int x = 0, int y = 0) {
  if (bit == -1) {
    rev[y] = x;
    return;
  }
  gen(bit - 1, x, y);
  gen(bit - 1, x + (1 << bit), y + (1 << lg - bit - 1));
}
int main() {
  int n, m;
  do {
    while ((n = getchar()) < '0')
      ;
    for (n -= '0'; '0' <= (_ = getchar()); n = (n << 3) + (n << 1) + _ - '0')
      ;
  } while (0);
  do {
    while ((m = getchar()) < '0')
      ;
    for (m -= '0'; '0' <= (_ = getchar()); m = (m << 3) + (m << 1) + _ - '0')
      ;
  } while (0);
  for (int i = 0, _n = (int)(n); i < _n; i++) {
    int x;
    do {
      while ((x = getchar()) < '0')
        ;
      for (x -= '0'; '0' <= (_ = getchar()); x = (x << 3) + (x << 1) + _ - '0')
        ;
    } while (0);
    a[x].first = a[x].first + 1;
    mark[x]++;
  }
  gen();
  FFT(a, false);
  for (int i = 0, _n = (int)(N); i < _n; i++) b[i] = a[i] * a[i];
  FFT(b, true);
  for (int i = 0, _n = (int)(m + 1); i < _n; i++) {
    int x = (b[i].first > 0.5);
    int y = mark[i];
    if (x && !y) {
      puts("NO");
      return 0;
    } else if (y && x == 0) {
      res[k++] = i;
    }
  }
  puts("YES");
  printf("%d\n", k);
  for (int i = 0, _n = (int)(k); i < _n; i++) printf("%d ", res[i]);
}
