#include <bits/stdc++.h>
using namespace std;
const long long maxn = 5e6 + 10, gen = 3, igen = 332748118, mo = 998244353;
long long cnt, n = 1, m1, m2, len, rev[maxn], f[maxn], g[maxn];
long long qpow(long long a, long long b) {
  long long ans = 1;
  for (; b; b >>= 1, a = a * a % mo)
    if (b & 1) ans = ans * a % mo;
  return ans % mo;
}
inline void NTT(long long *a, long long type) {
  for (long long i = 0; i < n; i++)
    if (i < rev[i]) swap(a[i], a[rev[i]]);
  for (long long mid = 1; mid < n; mid <<= 1) {
    long long wn = qpow(type == 1 ? gen : igen, (mo - 1) / (mid << 1));
    for (long long i = 0; i < n; i += (mid << 1))
      for (long long j = 0, w = 1; j < mid; j++, w = (w * wn) % mo) {
        long long tt = w * a[i + j + mid] % mo;
        a[i + j + mid] = ((a[i + j] - tt) % mo + mo) % mo,
                  a[i + j] = (a[i + j] + tt) % mo;
      }
  }
  long long invv = qpow(n, mo - 2);
  if (type == -1)
    for (long long i = 0; i < n; i++) a[i] = a[i] * invv % mo;
}
long long flag, ans, a[maxn], b[maxn];
signed main() {
  scanf("%lld%lld", &n, &m1);
  for (long long i = 1; i <= n; i++)
    scanf("%lld", &a[i]), b[a[i]] = 1, f[a[i]] = 1;
  f[0] = 1;
  n = 1;
  while (n <= m1 + m1) n <<= 1, len++;
  for (long long i = 0; i < n; i++)
    rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
  NTT(f, 1);
  for (long long i = 0; i < n; i++) f[i] = f[i] * f[i] % mo;
  NTT(f, -1);
  for (long long i = 1; i <= m1; i++) {
    if (b[i] == 0 && f[i] > 0)
      flag = -1;
    else if (b[i] == 1 && f[i] == 2)
      ans++;
  }
  if (flag == -1) cout << "NO", exit(0);
  cout << "YES" << endl;
  cout << ans << endl;
  for (long long i = 1; i <= m1; i++)
    if (f[i] == 2) printf("%lld ", i);
}
