#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
const double eps = 0.5;
struct cd {
  double r, c;
  cd(double rr = 0, double cc = 0) {
    r = rr;
    c = cc;
  }
};
inline cd operator+(const cd& a, const cd& b) {
  return cd(a.r + b.r, a.c + b.c);
}
inline cd operator-(const cd& a, const cd& b) {
  return cd(a.r - b.r, a.c - b.c);
}
inline cd operator*(const cd& a, const cd& b) {
  return cd(a.r * b.r - a.c * b.c, a.r * b.c + a.c * b.r);
}
inline cd operator/(const cd& a, const double& b) {
  return cd(a.r / b, a.c / b);
}
inline cd operator/(const cd& a, const int& b) { return cd(a.r / b, a.c / b); }
inline cd w(double angle) { return cd(cos(angle), sin(angle)); }
int rev[4000010];
void getrev(int bit) {
  for (int i = 1; i < (1 << bit); i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (bit - 1));
  return;
}
void fft(cd* a, int n, int dft) {
  for (int i = 0; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int step = 1; step < n; step <<= 1) {
    cd wn = w(dft * PI / step);
    for (int i = 0; i < n; i += step << 1) {
      cd wnk(1);
      for (int j = i; j < i + step; j++) {
        cd x = a[j], y = a[j + step] * wnk;
        a[j] = x + y;
        a[j + step] = x - y;
        wnk = wnk * wn;
      }
    }
  }
  if (dft == -1) {
    for (int i = 0; i < n; i++) a[i] = a[i] / n;
  }
  return;
}
int f[1000010];
cd g[4000010];
int main() {
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) {
    int x;
    scanf("%d", &x);
    f[x] = 1;
    g[x] = cd(1, 0);
  }
  int s = 1, bit = 0;
  while (s <= (m << 1)) s <<= 1, bit++;
  getrev(bit);
  fft(g, s, 1);
  for (int i = 0; i < s; i++) g[i] = g[i] * g[i];
  fft(g, s, -1);
  int cnt = 0;
  for (int i = 1; i <= m; i++)
    if (f[i]) {
      if (g[i].r < eps) cnt++;
    } else if (g[i].r > eps) {
      printf("NO\n");
      return 0;
    }
  printf("YES\n%d\n", cnt);
  for (int i = 1; i <= m; i++)
    if (f[i] && g[i].r < eps) printf("%d ", i);
  printf("\n");
  return 0;
}
