#include <bits/stdc++.h>
using namespace std;
struct node {
  double x, y;
  node() {}
  node(double xx, double yy) : x(xx), y(yy) {}
} f[2097152];
const double pi = acos(-1.0);
inline node operator+(const node x, const node y) {
  return node(x.x + y.x, x.y + y.y);
}
inline node operator-(const node x, const node y) {
  return node(x.x - y.x, x.y - y.y);
}
inline node operator*(const node x, const node y) {
  return node(x.x * y.x - x.y * y.y, x.x * y.y + x.y * y.x);
}
inline node operator/(const node x, const double y) {
  return node(x.x / y, x.y / y);
}
int ans[1000010], n, m, tot;
bool b[1048576];
char buf[1000010], buff[1000010], *cur = buf + 1000010, *curr = buff;
inline char getc() {
  (cur == buf + 1000010) ? fread(cur = buf, 1, 1000010, stdin) : 0;
  return *cur++;
}
inline int rd() {
  int x = 0;
  char ch = getc();
  for (; ch < '0' || ch > '9'; ch = getc())
    ;
  for (; ch >= '0' && ch <= '9'; ch = getc()) x = x * 10 + ch - '0';
  return x;
}
inline void flush() { fwrite(buff, 1, curr - buff, stdout); }
inline void putc(const char ch) {
  (curr == buff + 1000010) ? fwrite(curr = buff, 1, 1000010, stdout) : 0;
  *curr++ = ch;
}
inline void print(int x) {
  static char s[233];
  if (!x) {
    putc('0');
    return;
  }
  int tot = 0;
  for (; x; x /= 10) s[++tot] = x % 10 + '0';
  for (; tot; tot--) putc(s[tot]);
}
inline void fft(node *a, int n, int on) {
  static int rev[2097152];
  for (int i = 1; i < n; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) ? (n >> 1) : 0);
  for (int i = 1; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (int w = 2; w <= n; w <<= 1) {
    node now(cos(pi * 2 / w), sin(pi * 2 / w));
    for (int k = 0; k < n; k += w) {
      node hh(1, 0);
      for (int j = k; j < k + (w >> 1); j++) {
        node u = a[j], t = a[j + (w >> 1)] * hh;
        a[j] = u + t;
        a[j + (w >> 1)] = u - t;
        hh = hh * now;
      }
    }
  }
  if (on == -1) {
    reverse(a + 1, a + n);
    for (int i = 0; i < n; i++) a[i] = a[i] / n;
  }
}
int main() {
  n = rd();
  m = rd();
  for (int i = 1; i <= n; i++) b[rd()] = true;
  b[0] = true;
  int len = 1;
  for (; len <= m * 2; len <<= 1)
    ;
  for (int i = 0; i <= m; i++) f[i] = node(b[i], 0);
  for (int i = m + 1; i < len; i++) f[i] = node(0, 0);
  fft(f, len, 1);
  for (int i = 0; i < len; i++) f[i] = f[i] * f[i];
  fft(f, len, -1);
  bool flag = true;
  for (int i = 0; i <= m; i++)
    if (((long long)(f[i].x + 0.5)) != 0 && !b[i]) {
      flag = false;
      break;
    }
  if (!flag) {
    puts("NO");
    return 0;
  }
  tot = 0;
  for (int i = 1; i <= m; i++)
    if (((long long)(f[i].x + 0.5)) == 2) ans[++tot] = i;
  puts("YES");
  print(tot);
  putc('\n');
  for (int i = 1; i <= tot; i++) print(ans[i]), putc(' ');
  putc('\n');
  flush();
  return 0;
}
