#include <bits/stdc++.h>
using namespace std;
const int inf = 0x20202020;
const int mod = 1000000007;
template <class T>
inline void read(T &first) {
  bool fu = 0;
  char c;
  for (c = getchar(); c <= 32; c = getchar())
    ;
  if (c == '-') fu = 1, c = getchar();
  for (first = 0; c > 32; c = getchar()) first = first * 10 + c - '0';
  if (fu) first = -first;
};
template <class T>
inline void read(T &first, T &second) {
  read(first);
  read(second);
}
template <class T>
inline void read(T &first, T &second, T &z) {
  read(first);
  read(second);
  read(z);
}
template <class T>
inline void read(T &first, T &second, T &z, T &q) {
  read(first);
  read(second);
  read(z);
  read(q);
}
const int DX[] = {1, 0, -1, 0}, DY[] = {0, 1, 0, -1};
long long powmod(long long a, long long b) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long powmod(long long a, long long b, long long mod) {
  long long res = 1;
  a %= mod;
  for (; b; b >>= 1) {
    if (b & 1) res = res * a % mod;
    a = a * a % mod;
  }
  return res;
}
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
const int N = 2111111, M = 111111;
const double PI = acos(-1);
complex<double> pow_[N], a[N], b[N], ans[N];
void fft(const complex<double> *a, const int &n, const int &step,
         complex<double> *ans, const int &ty) {
  if (n == 1) {
    ans[0] = a[0];
    return;
  }
  int m = n >> 1;
  fft(a, m, step << 1, ans, ty);
  fft(a + step, m, step << 1, ans + m, ty);
  for (int i = 0; i < m; ++i) {
    complex<double> even = ans[i], odd = ans[i + m];
    if (ty == 1)
      odd *= pow_[i * step];
    else
      odd /= pow_[i * step];
    ans[i] = even + odd;
    ans[i + m] = even - odd;
  }
}
void fft(const complex<double> *a, const complex<double> *b, int n,
         complex<double> *ans) {
  int m = 1;
  for (; m < (n << 1); m <<= 1)
    ;
  n = m;
  for (int i = 0; i < n; ++i)
    pow_[i] = exp(complex<double>(0.0, -2 * PI * i / n));
  static complex<double> ta[N], tb[N];
  fft(a, n, 1, ta, 1);
  fft(b, n, 1, tb, 1);
  for (int i = 0; i < n; ++i) ta[i] *= tb[i];
  fft(ta, n, 1, ans, -1);
  for (int i = 0; i < n; ++i) ans[i] /= n;
}
int l, m, n, t, C;
int v[N];
int main() {
  scanf("%d%d", &n, &m);
  for (int i = (1); i <= (n); ++i) scanf("%d", &t), a[t] = b[t] = v[t] = 1;
  fft(a, b, m, ans);
  for (int i = (1); i <= (m); ++i)
    if (ans[i].real() > 0.5 && !v[i]) {
      puts("NO");
      return 0;
    }
  int cnt = 0;
  for (int i = (1); i <= (m); ++i)
    if (ans[i].real() < 0.5 && v[i]) ++cnt;
  printf("YES\n%d\n", cnt);
  for (int i = (1); i <= (m); ++i)
    if (ans[i].real() < 0.5 && v[i]) printf("%d ", i);
  puts("");
  return 0;
}
