#include <bits/stdc++.h>
using namespace std;
const double PI = 3.141592653589793238462;
pair<double, double> ComplexMultiply(const pair<double, double> complex_a,
                                     const pair<double, double> complex_b) {
  return make_pair(
      complex_a.first * complex_b.first - complex_a.second * complex_b.second,
      complex_a.first * complex_b.second + complex_a.second * complex_b.first);
}
pair<double, double> ComplexAdd(const pair<double, double> complex_a,
                                const pair<double, double> complex_b) {
  return make_pair(complex_a.first + complex_b.first,
                   complex_a.second + complex_b.second);
}
pair<double, double> ComplexSubstract(const pair<double, double> complex_a,
                                      const pair<double, double> complex_b) {
  return make_pair(complex_a.first - complex_b.first,
                   complex_a.second - complex_b.second);
}
vector<pair<double, double> > IterativeDFT(
    const vector<pair<double, double> >& seq, int direction) {
  assert(!(((int)(seq).size()) & (((int)(seq).size()) - 1)));
  pair<double, double>* placeholder =
      new pair<double, double>[((int)(seq).size())];
  pair<double, double>* tmp = new pair<double, double>[((int)(seq).size())];
  int n = ((int)(seq).size());
  int bits = 0;
  int tmp_n = n;
  while (tmp_n > 1) {
    ++bits;
    tmp_n /= 2;
  }
  for (int(i) = 0; (i) < (n); ++(i)) {
    int res = 0;
    int tmp_i = i;
    for (int(j) = 0; (j) < (bits); ++(j)) {
      if (tmp_i % 2) {
        res += (1 << (bits - j - 1));
      }
      tmp_i /= 2;
    }
    placeholder[i] = seq[res];
  }
  for (int comp_size = 2; comp_size <= n; comp_size *= 2) {
    for (int j = 0; j < n; j += comp_size) {
      int n_mem = comp_size / 2;
      double w_mult_exp_i = 2.0 * PI / (double)comp_size;
      if (!direction) w_mult_exp_i *= -1.0;
      double w_mult_sin = sin(w_mult_exp_i);
      double w_mult_cos = sqrt(1.0 - w_mult_sin * w_mult_sin);
      pair<double, double> w_mult = make_pair(w_mult_cos, w_mult_sin);
      pair<double, double> w = make_pair(1.0, 0.0);
      for (int k = 0; k < n_mem; ++k) {
        int idx = k % (n_mem);
        tmp[k] = ComplexAdd(placeholder[j + idx],
                            ComplexMultiply(w, placeholder[j + n_mem + idx]));
        tmp[k + n_mem] =
            ComplexSubstract(placeholder[j + idx],
                             ComplexMultiply(w, placeholder[j + n_mem + idx]));
        w = ComplexMultiply(w, w_mult);
      }
      for (int k = 0; k < comp_size; ++k) {
        placeholder[j + k] = tmp[k];
      }
    }
  }
  vector<pair<double, double> > result;
  for (int i = 0; i < n; ++i) {
    result.push_back(placeholder[i]);
  }
  delete[] placeholder;
  delete[] tmp;
  return result;
}
vector<double> FFT(vector<double> a, vector<double> b) {
  if (((int)(a).size()) == 0) a.push_back(0);
  if (((int)(b).size()) == 0) b.push_back(0);
  int n_final_elements = ((int)(a).size()) + ((int)(b).size()) - 1;
  int actual_size = 1;
  while (actual_size < max(((int)(a).size()), ((int)(b).size()))) {
    actual_size *= 2;
  }
  actual_size *= 2;
  while (((int)(a).size()) < actual_size) a.push_back(0);
  while (((int)(b).size()) < actual_size) b.push_back(0);
  vector<pair<double, double> > dft_input_a, dft_input_b;
  for (int(i) = 0; (i) < (actual_size); ++(i)) {
    dft_input_a.push_back(make_pair(a[i], 0.0));
    dft_input_b.push_back(make_pair(b[i], 0.0));
  }
  dft_input_a = IterativeDFT(dft_input_a, 1);
  dft_input_b = IterativeDFT(dft_input_b, 1);
  for (int(i) = 0; (i) < (actual_size); ++(i))
    dft_input_a[i] = ComplexMultiply(dft_input_a[i], dft_input_b[i]);
  dft_input_a = IterativeDFT(dft_input_a, 0);
  vector<double> res;
  for (int(i) = 0; (i) < (n_final_elements); ++(i)) {
    res.push_back(dft_input_a[i].first / (double)actual_size);
  }
  return res;
}
int tas[1050000];
int main() {
  int n, m;
  cin >> n >> m;
  vector<double> bags(m + 1, 0.0);
  for (int(i) = 0; (i) < (n); ++(i)) {
    int x;
    scanf("%d", &x);
    tas[x] = 1;
    bags[x] = 1.0;
  }
  vector<double> ffted = FFT(bags, bags);
  vector<int> weights;
  int possible = 1;
  for (int i = 1; i <= m; ++i) {
    if (ffted[i] > 0.5 && !tas[i]) {
      possible = 0;
      break;
    }
    if (ffted[i] < 0.5 && tas[i]) {
      weights.push_back(i);
    }
  }
  if (!possible) {
    cout << "NO" << endl;
  } else {
    cout << "YES" << endl;
    cout << ((int)(weights).size()) << endl;
    for (int(i) = 0; (i) < (((int)(weights).size())); ++(i)) {
      printf("%d ", weights[i]);
    }
  }
}
