#include <bits/stdc++.h>
template <typename Tp>
void in(Tp &x) {
  char ch = getchar(), f = 1;
  x = 0;
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') ch = getchar(), f = -1;
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= f;
}
template <typename Tp>
Tp Max(const Tp &x, const Tp &y) {
  return x > y ? x : y;
}
template <typename Tp>
Tp Min(const Tp &x, const Tp &y) {
  return x < y ? x : y;
}
template <typename Tp>
bool chkmax(Tp &x, Tp y) {
  return x >= y ? 0 : (x = y, 1);
}
template <typename Tp>
bool chkmin(Tp &x, Tp y) {
  return x <= y ? 0 : (x = y, 1);
}
const int MAXN = 2200010, MOD = 998244353, B = 3;
template <typename Tp>
struct complex {
  Tp x, y;
  complex(Tp a = 0, Tp b = 0) {
    x = a;
    y = b;
  }
  double real() { return x; }
  complex operator+(const complex &another) const {
    return complex(x + another.x, y + another.y);
  };
  complex operator-(const complex &another) const {
    return complex(x - another.x, y - another.y);
  }
  complex operator*(const complex &another) const {
    return complex((x * another.x - y * another.y),
                   (y * another.x + x * another.y));
  };
};
bool is[MAXN];
int n, m, rev[MAXN], real[MAXN];
int num[MAXN];
int power(int x, int y) {
  int ret = 1;
  while (y) {
    if (y & 1) ret = 1ll * ret * x % MOD;
    x = 1ll * x * x % MOD;
    y >>= 1;
  }
  return ret;
}
void FFT(int *a, int n, int tp) {
  for (int i = (0), i_END_ = (n - 1); i <= i_END_; i++)
    if (i < rev[i]) std::swap(a[i], a[rev[i]]);
  for (int i = 1; i < n; i <<= 1) {
    int wn = power(3, (MOD - 1) / (i << 1));
    if (tp == -1) wn = power(wn, MOD - 2);
    for (int j = 0, p = i << 1; j < n; j += p) {
      int w = 1;
      for (int k = 0; k < i; k++, w = 1ll * w * wn % MOD) {
        int t1 = a[j + k], t2 = 1ll * a[j + k + i] * w % MOD;
        a[j + k] = (t1 + t2) % MOD;
        a[j + k + i] = (t1 - t2 + MOD) % MOD;
      }
    }
  }
}
int main() {
  in(n);
  in(m);
  for (int i = (1), i_END_ = (n); i <= i_END_; i++) {
    int x;
    in(x);
    num[x] = 1;
    is[x] = true;
  }
  int tn = m + m, L = -1;
  for (m = 1; m <= tn; m <<= 1) L++;
  for (int i = (1), i_END_ = (m); i <= i_END_; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << L);
  FFT(num, m, 1);
  for (int i = (0), i_END_ = (m - 1); i <= i_END_; i++)
    num[i] = 1ll * num[i] * num[i] % MOD;
  FFT(num, m, -1);
  for (int i = (1), i_END_ = (tn / 2); i <= i_END_; i++) real[i] = num[i];
  for (int i = (1), i_END_ = (tn / 2); i <= i_END_; i++)
    if (real[i] > 0 && !is[i]) {
      puts("NO");
      return 0;
    }
  puts("YES");
  int tot = 0;
  for (int i = (1), i_END_ = (tn / 2); i <= i_END_; i++)
    if (real[i] == 0 && is[i]) tot++;
  printf("%d\n", tot);
  for (int i = (1), i_END_ = (tn / 2); i <= i_END_; i++)
    if (real[i] == 0 && is[i]) printf("%d ", i);
  putchar(10);
  return 0;
}
