# include <iostream>
# include <sstream>
# include <cstdio>
# include <cstdlib>
# include <algorithm>
# include <string>
# include <cstring>
# include <cmath>
# include <stack>
# include <queue>
# include <vector>
# include <list>
# include <map>
# include <set>
# include <deque>
# include <iterator>
# include <functional>
# include <bitset>
# include <climits>
# include <ctime>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define odd(x) ((x)&1)
#define sqr(x) ((x)*(x))
#define mp make_pair
#define pb push_back
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define mem(a,x) memset(a,x,sizeof(a))
#define rep(i,a,b) for (int i=(a); i<=(b); ++i)
#define per(i,a,b) for (int i=(a); i>=(b); --i)
#define rep_it(it,x) for (__typeof((x).begin()) it=(x).begin(); it!=(x).end(); it++)
#define ____ puts("\n_______________\n\n")
#define debug(x) ____; cout<< #x << " => " << (x) << endl
#define debug_pair(x) cout<<"\n{ "<<(x).fir<<" , "<<(x).sec<<" }\n"
#define debug_arr(x,n) ____; cout<<#x<<":\n"; rep(i,0,n) cout<<#x<<"["<<(i)<<"] => "<<x[i]<<endl
#define debug_arr2(x,n,m) ____; cout<<#x<<":\n"; rep(i,0,n) rep(j,0,m) cout<<#x<<"["<<(i)<<"]["<<(j)<<"]= "<<x[i][j]<<((j==m)?"\n\n":"    ")
#define debug_set(x) ____; cout<<#x<<": \n"; rep_it(it,x) cout<<(*it)<<" "; cout<<endl
#define debug_map(x) ____; cout<<#x<<": \n"; rep_it(it,x) debug_pair(*it)
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int oo = /*2 * 1000 * 1000 * 1000*/0x3f3f3f3f;
const ll ooo=9223372036854775807ll;
const int _cnt = 1000 * 1000 + 7;
const int _p = 998244353;
const int N=3000005;
const double PI=acos(-1.0);
const double eps=1e-9;
int o(int x) { return x%_p; }
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
int lcm(int a, int b) { return a / gcd(a, b)*b; }

void file_put() {
    freopen("filename.in", "r", stdin);
    freopen("filename.out", "w", stdout);
}

ll Pow(ll x,ll k) { ll ans=1; for (;k;k>>=1,x=x*x%_p) if (k&1) (ans*=x)%=_p; return ans; }

template <class V>
struct FT{
	static const int N=1<<21; V w[2][N*2+5],rev[N*2+5],tmp;
	void Init() {
		V w0=Pow(3,(_p-1)/N),m; w[0][0]=w[1][0]=1;
		rep(i,1,N-1) w[0][i]=w[1][N-i]=(ll)w[0][i-1]*w0%_p;
		for (m=0; (1<<m)!=N; m++);
		rep(i,1,N-1) rev[i]=(rev[i>>1]>>1)|(i&1)<<m-1;
	}
	void FFT(V A[],int op){
		rep(i,0,N-1) if (i<rev[i]) swap(A[i],A[rev[i]]);
		for (int i=1; i<N; i<<=1)
			for (int j=0,t=N/(i<<1); j<N; j+=i<<1)
				for (int k=j,l=0; k<j+i; k++,l+=t) {
					V x=A[k],y=(ll)w[op][l]*A[k+i]%_p;
					A[k]=(x+y)%_p,A[k+i]=(x-y+_p)%_p;
				}
		if (op) { tmp=Pow(N,_p-2); rep(i,0,N-1) A[i]=1ll*A[i]*tmp%_p; }
	}
	void Solve(V A[],V B[],V C[],int op=0) {
		if (op) reverse(B,B+N); FFT(A,0);
		rep(i,0,N-1) C[i]=(ll)A[i]*B[i]%_p; FFT(C,1); if (op) reverse(C,C+N);
	}
};

FT<int> T; int n,m,a[N],b[N],c[N],ret[N]; vi ans;

int main() {
    //file_put();

    scanf("%d%d",&n,&m);
    rep(i,1,n) scanf("%d",&a[i]),c[a[i]]=1,b[a[i]]=1;
    T.Init();
    T.Solve(b,b,ret);
    rep(i,1,m) if (ret[i] && !c[i]) return 0*printf("NO\n");
    printf("YES\n");
    rep(i,1,n) if (!ret[a[i]]) ans.pb(a[i]);
    printf("%d\n",ans.size());
	for (auto t: ans) printf("%d ",t);
	printf("\n");

    return 0;
}


# include <iostream>
# include <sstream>
# include <cstdio>
# include <cstdlib>
# include <algorithm>
# include <string>
# include <cstring>
# include <cmath>
# include <stack>
# include <queue>
# include <vector>
# include <list>
# include <map>
# include <set>
# include <deque>
# include <iterator>
# include <functional>
# include <bitset>
# include <climits>
# include <ctime>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define odd(x) ((x)&1)
#define sqr(x) ((x)*(x))
#define mp make_pair
#define pb push_back
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define mem(a,x) memset(a,x,sizeof(a))
#define rep(i,a,b) for (int i=(a); i<=(b); ++i)
#define per(i,a,b) for (int i=(a); i>=(b); --i)
#define rep_it(it,x) for (__typeof((x).begin()) it=(x).begin(); it!=(x).end(); it++)
#define ____ puts("\n_______________\n\n")
#define debug(x) ____; cout<< #x << " => " << (x) << endl
#define debug_pair(x) cout<<"\n{ "<<(x).fir<<" , "<<(x).sec<<" }\n"
#define debug_arr(x,n) ____; cout<<#x<<":\n"; rep(i,0,n) cout<<#x<<"["<<(i)<<"] => "<<x[i]<<endl
#define debug_arr2(x,n,m) ____; cout<<#x<<":\n"; rep(i,0,n) rep(j,0,m) cout<<#x<<"["<<(i)<<"]["<<(j)<<"]= "<<x[i][j]<<((j==m)?"\n\n":"    ")
#define debug_set(x) ____; cout<<#x<<": \n"; rep_it(it,x) cout<<(*it)<<" "; cout<<endl
#define debug_map(x) ____; cout<<#x<<": \n"; rep_it(it,x) debug_pair(*it)
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int oo = /*2 * 1000 * 1000 * 1000*/0x3f3f3f3f;
const ll ooo=9223372036854775807ll;
const int _cnt = 1000 * 1000 + 7;
const int _p = 998244353;
const int N=2500005;
const double PI=acos(-1.0);
const double eps=1e-9;
int o(int x) { return x%_p; }
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
int lcm(int a, int b) { return a / gcd(a, b)*b; }

void file_put() {
    freopen("filename.in", "r", stdin);
    freopen("filename.out", "w", stdout);
}

ll Pow(ll x,ll k) { ll ans=1; for (;k;k>>=1,x=x*x%_p) if (k&1) (ans*=x)%=_p; return ans; }

template <class V>
struct FT{
	static const int N=1<<21; V w[2][N*2+5],rev[N*2+5],tmp;
	void Init() {
		V w0=Pow(3,(_p-1)/N),m; w[0][0]=w[1][0]=1;
		rep(i,1,N-1) w[0][i]=w[1][N-i]=(ll)w[0][i-1]*w0%_p;
		for (m=0; (1<<m)!=N; m++);
		rep(i,1,N-1) rev[i]=(rev[i>>1]>>1)|(i&1)<<m-1;
	}
	void FFT(V A[],int op){
		rep(i,0,N-1) if (i<rev[i]) swap(A[i],A[rev[i]]);
		for (int i=1; i<N; i<<=1)
			for (int j=0,t=N/(i<<1); j<N; j+=i<<1)
				for (int k=j,l=0; k<j+i; k++,l+=t) {
					V x=A[k],y=(ll)w[op][l]*A[k+i]%_p;
					A[k]=(x+y)%_p,A[k+i]=(x-y+_p)%_p;
				}
		if (op) { tmp=Pow(N,_p-2); rep(i,0,N-1) A[i]=1ll*A[i]*tmp%_p; }
	}
	void Solve(V A[],V B[],V C[],int op=0) {
		if (op) reverse(B,B+N); FFT(A,0);
		rep(i,0,N-1) C[i]=(ll)A[i]*B[i]%_p; FFT(C,1); if (op) reverse(C,C+N);
	}
};

FT<int> T; int n,m,a[N],b[N],c[N],ret[N]; vi ans;

int main() {
    //file_put();

    scanf("%d%d",&n,&m);
    rep(i,1,n) scanf("%d",&a[i]),c[a[i]]=1,b[a[i]]=1;
    T.Init();
    T.Solve(b,b,ret);
    rep(i,1,m) if (ret[i] && !c[i]) return 0*printf("NO\n");
    printf("YES\n");
    rep(i,1,n) if (!ret[a[i]]) ans.pb(a[i]);
    printf("%d\n",ans.size());
	for (auto t: ans) printf("%d ",t);
	printf("\n");

    return 0;
}


# include <iostream>
# include <sstream>
# include <cstdio>
# include <cstdlib>
# include <algorithm>
# include <string>
# include <cstring>
# include <cmath>
# include <stack>
# include <queue>
# include <vector>
# include <list>
# include <map>
# include <set>
# include <deque>
# include <iterator>
# include <functional>
# include <bitset>
# include <climits>
# include <ctime>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define odd(x) ((x)&1)
#define sqr(x) ((x)*(x))
#define mp make_pair
#define pb push_back
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define mem(a,x) memset(a,x,sizeof(a))
#define rep(i,a,b) for (int i=(a); i<=(b); ++i)
#define per(i,a,b) for (int i=(a); i>=(b); --i)
#define rep_it(it,x) for (__typeof((x).begin()) it=(x).begin(); it!=(x).end(); it++)
#define ____ puts("\n_______________\n\n")
#define debug(x) ____; cout<< #x << " => " << (x) << endl
#define debug_pair(x) cout<<"\n{ "<<(x).fir<<" , "<<(x).sec<<" }\n"
#define debug_arr(x,n) ____; cout<<#x<<":\n"; rep(i,0,n) cout<<#x<<"["<<(i)<<"] => "<<x[i]<<endl
#define debug_arr2(x,n,m) ____; cout<<#x<<":\n"; rep(i,0,n) rep(j,0,m) cout<<#x<<"["<<(i)<<"]["<<(j)<<"]= "<<x[i][j]<<((j==m)?"\n\n":"    ")
#define debug_set(x) ____; cout<<#x<<": \n"; rep_it(it,x) cout<<(*it)<<" "; cout<<endl
#define debug_map(x) ____; cout<<#x<<": \n"; rep_it(it,x) debug_pair(*it)
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef vector<int> vi;
const int oo = /*2 * 1000 * 1000 * 1000*/0x3f3f3f3f;
const ll ooo=9223372036854775807ll;
const int _cnt = 1000 * 1000 + 7;
const int _p = 998244353;
const int N=1500005;
const double PI=acos(-1.0);
const double eps=1e-9;
int o(int x) { return x%_p; }
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }
int lcm(int a, int b) { return a / gcd(a, b)*b; }

void file_put() {
    freopen("filename.in", "r", stdin);
    freopen("filename.out", "w", stdout);
}

ll Pow(ll x,ll k) { ll ans=1; for (;k;k>>=1,x=x*x%_p) if (k&1) (ans*=x)%=_p; return ans; }

template <class V>
struct FT{
	static const int N=1<<20; V w[2][N*2+5],rev[N*2+5],tmp;
	void Init() {
		V w0=Pow(3,(_p-1)/N),m; w[0][0]=w[1][0]=1;
		rep(i,1,N-1) w[0][i]=w[1][N-i]=(ll)w[0][i-1]*w0%_p;
		for (m=0; (1<<m)!=N; m++);
		rep(i,1,N-1) rev[i]=(rev[i>>1]>>1)|(i&1)<<m-1;
	}
	void FFT(V A[],int op){
		rep(i,0,N-1) if (i<rev[i]) swap(A[i],A[rev[i]]);
		for (int i=1; i<N; i<<=1)
			for (int j=0,t=N/(i<<1); j<N; j+=i<<1)
				for (int k=j,l=0; k<j+i; k++,l+=t) {
					V x=A[k],y=(ll)w[op][l]*A[k+i]%_p;
					A[k]=(x+y)%_p,A[k+i]=(x-y+_p)%_p;
				}
		if (op) { tmp=Pow(N,_p-2); rep(i,0,N-1) A[i]=1ll*A[i]*tmp%_p; }
	}
	void Solve(V A[],V B[],V C[],int op=0) {
		if (op) reverse(B,B+N); FFT(A,0);
		rep(i,0,N-1) C[i]=(ll)A[i]*B[i]%_p; FFT(C,1); if (op) reverse(C,C+N);
	}
};

FT<int> T; int n,m,a[N],b[N],c[N],ret[N]; vi ans;

int main() {
    //file_put();

    scanf("%d%d",&n,&m);
    rep(i,1,n) scanf("%d",&a[i]),c[a[i]]=1,b[a[i]]=1;
    T.Init();
    T.Solve(b,b,ret);
    rep(i,1,m) if (ret[i] && !c[i]) return 0*printf("NO\n");
    printf("YES\n");
    rep(i,1,n) if (!ret[a[i]]) ans.pb(a[i]);
    printf("%d\n",ans.size());
	for (auto t: ans) printf("%d ",t);
	printf("\n");

    return 0;
}


#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=5000010;
const double pi=acos(-1.0);
struct C{
	double r,i;C(){}
	C (double x,double y){r=x;i=y;}
	C operator + (C x){return C(r+x.r,i+x.i);}
	C operator - (C x){return C(r-x.r,i-x.i);}
	C operator * (C x){return C(r*x.r-i*x.i,r*x.i+i*x.r);}
}a[N],b[N],c[N],w[N];
int n,m,i,j,k,p[N],l,A,x,s[N],ans[N],sum;
void fft(C a[],int n){for (i=0;i<n;i++) if (p[i]>i) swap(a[p[i]],a[i]);
	for (int t=n>>1,d=1;d<n;d<<=1,t>>=1) for (int i=0;i<n;i+=(d<<1)) for (int j=0;j<d;j++){C tmp=w[t*j]*a[i+j+d];a[i+j+d]=a[i+j]-tmp;a[i+j]=a[i+j]+tmp;}
}
int main(){
	scanf("%d%d",&A,&m);a[0].r=b[0].r=1;for (i=1;i<=A;i++) scanf("%d",&x),a[x].r=b[x].r=s[x]=1;for (n=1,l=0;n<=2*m+2;n<<=1,l++);
	for (i=0;i<n;i++) p[i]=(p[i>>1]>>1)|((i&1)<<(l-1)),w[i]=C(cos(2.0*i*pi/n),sin(2.0*i*pi/n));fft(a,n);fft(b,n);
	for (i=0;i<n;i++) w[i].i=-w[i].i,c[i]=a[i]*b[i];fft(c,n);for (i=0;i<n;i++) ans[i]=int(c[i].r/n+0.5);
	for (i=1;i<=m;i++) if (s[i]==0&&ans[i]){printf("NO\n");return 0;} else if (ans[i]==2) sum++;printf("YES\n%d\n",sum);for (i=1;i<=m;i++) if (s[i]&&ans[i]==2) printf("%d ",i);return 0;
}


#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int N=2200010;
const double pi=acos(-1.0);
struct C{
	double r,i;C(){}
	C (double x,double y){r=x;i=y;}
	C operator + (C x){return C(r+x.r,i+x.i);}
	C operator - (C x){return C(r-x.r,i-x.i);}
	C operator * (C x){return C(r*x.r-i*x.i,r*x.i+i*x.r);}
}a[N],b[N],c[N],w[N];
int n,m,i,j,k,p[N],l,A,x,s[N],ans[N],sum;
void fft(C a[],int n){for (i=0;i<n;i++) if (p[i]>i) swap(a[p[i]],a[i]);
	for (int t=n>>1,d=1;d<n;d<<=1,t>>=1) for (int i=0;i<n;i+=(d<<1)) for (int j=0;j<d;j++){C tmp=w[t*j]*a[i+j+d];a[i+j+d]=a[i+j]-tmp;a[i+j]=a[i+j]+tmp;}
}
int main(){
	scanf("%d%d",&A,&m);a[0].r=b[0].r=1;for (i=1;i<=A;i++) scanf("%d",&x),a[x].r=b[x].r=s[x]=1;for (n=1,l=0;n<=2*m+2;n<<=1,l++);
	for (i=0;i<n;i++) p[i]=(p[i>>1]>>1)|((i&1)<<(l-1)),w[i]=C(cos(2.0*i*pi/n),sin(2.0*i*pi/n));fft(a,n);fft(b,n);
	for (i=0;i<n;i++) w[i].i=-w[i].i,c[i]=a[i]*b[i];fft(c,n);for (i=0;i<n;i++) ans[i]=int(c[i].r/n+0.5);
	for (i=1;i<=m;i++) if (s[i]==0&&ans[i]){printf("NO\n");return 0;} else if (ans[i]==2) sum++;printf("YES\n%d\n",sum);for (i=1;i<=m;i++) if (s[i]&&ans[i]==2) printf("%d ",i);return 0;
}


// Can U hack it?

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef pair<ld,ld> pld;

const int maxn=21e5+10,TW=2097152;
const ld pi=3.141592653589793238462643383279;

pld operator*(pld a,pld b) { return {a.F*b.F-a.S*b.S,a.F*b.S+a.S*b.F}; }
pld operator+(pld a,pld b) { return {a.F+b.F,a.S+b.S}; }
pld operator-(pld a,pld b) { return {a.F-b.F,a.S-b.S}; }

pld w[maxn],arr1[maxn],arr2[maxn];

void pre(){
    w[0]={1,0};
    w[1]={cos(2*pi/TW),sin(2*pi/TW)};
    for(int i=2;i<=TW;i++)
	w[i]=w[1]*w[i-1];
}

void fft(pld *a,bool rev){
    for(int ln=1;ln<TW;ln*=2){
	int step=(TW/(2*ln));
	for(int st=0;st<step;st++){
	    for(int i=0;i<ln;i++){
		arr1[i]=a[st+2*i*step];
		arr2[i]=a[st+2*i*step+step];
	    }
	    for(int i=0;i<ln;i++){
		pld A=arr1[i],B=arr2[i]*w[(rev?-1:1)*step*i+(rev?TW:0)];
		a[st+i*step]=A+B;
		a[st+(i+ln)*step]=A-B;
	    }
	}
    }
    if(rev){
	for(int i=0;i<TW;i++)
	    a[i].F/=TW;
    }
}

pld p[maxn];
bool q1[maxn],q2[maxn];
vector<int>ans;

int main(){
    pre();
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
	int x;scanf("%d",&x);
	p[x].F=q1[x]=1;
    }
    fft(p,0);
    for(int i=0;i<TW;i++)
	p[i]=p[i]*p[i];
    fft(p,1);
    for(int i=0;i<TW;i++)
	q2[i]=ll(p[i].F+0.5)>0;
    for(int i=0;i<=m;i++){
	if(!q1[i] && q2[i]){
	    printf("NO\n");
	    return 0;
	}
	if(q1[i] && !q2[i]){
	    ans.PB(i);
	}
    }
    printf("YES\n%d\n",sz(ans));
    for(int x:ans)
	printf("%d ",x);
    printf("\n");
}


// Can U hack it?

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef pair<ld,ld> pld;

const int maxn=3e6+10,TW=2097152;
const ld pi=3.141592653589793238462643383279;

pld operator*(pld a,pld b) { return {a.F*b.F-a.S*b.S,a.F*b.S+a.S*b.F}; }
pld operator+(pld a,pld b) { return {a.F+b.F,a.S+b.S}; }
pld operator-(pld a,pld b) { return {a.F-b.F,a.S-b.S}; }

pld w[maxn],arr1[maxn],arr2[maxn];

void pre(){
    w[0]={1,0};
    w[1]={cos(2*pi/TW),sin(2*pi/TW)};
    for(int i=2;i<=TW;i++)
	w[i]=w[1]*w[i-1];
}

void fft(pld *a,bool rev){
    for(int ln=1;ln<TW;ln*=2){
	int step=(TW/(2*ln));
	for(int st=0;st<step;st++){
	    for(int i=0;i<ln;i++){
		arr1[i]=a[st+2*i*step];
		arr2[i]=a[st+2*i*step+step];
	    }
	    for(int i=0;i<ln;i++){
		pld A=arr1[i],B=arr2[i]*w[(rev?-1:1)*step*i+(rev?TW:0)];
		a[st+i*step]=A+B;
		a[st+(i+ln)*step]=A-B;
	    }
	}
    }
    if(rev){
	for(int i=0;i<TW;i++)
	    a[i].F/=TW;
    }
}

pld p[maxn];
bool q1[maxn],q2[maxn];
vector<int>ans;

int main(){
    pre();
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
	int x;scanf("%d",&x);
	p[x].F=q1[x]=1;
    }
    fft(p,0);
    for(int i=0;i<TW;i++)
	p[i]=p[i]*p[i];
    fft(p,1);
    for(int i=0;i<TW;i++)
	q2[i]=ll(p[i].F+0.5)>0;
    for(int i=0;i<=m;i++){
	if(!q1[i] && q2[i]){
	    printf("NO\n");
	    return 0;
	}
	if(q1[i] && !q2[i]){
	    ans.PB(i);
	}
    }
    printf("YES\n%d\n",sz(ans));
    for(int x:ans)
	printf("%d ",x);
    printf("\n");
}


// Can U hack it?

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef long double ld;
typedef pair<ld,ld> pld;

const int maxn=21e5+10,TW=2097152,twl=21;
const ld pi=3.141592653589793238462643383279;

pld operator*(pld a,pld b) { return {a.F*b.F-a.S*b.S,a.F*b.S+a.S*b.F}; }
pld operator+(pld a,pld b) { return {a.F+b.F,a.S+b.S}; }
pld operator-(pld a,pld b) { return {a.F-b.F,a.S-b.S}; }

pld w[maxn],tmp[maxn];
int REV[maxn];

void pre(){
    w[0]={1,0};
    w[1]={cos(2*pi/TW),sin(2*pi/TW)};
    for(int i=2;i<=TW;i++)
	w[i]=w[1]*w[i-1];
    for(int msk=1;msk<TW;msk++){
	int num=0;
	for(int i=0;i<twl;i++){
	    if(bit(msk,i))
		num+=(1<<(twl-1-i));
	    REV[msk]=num;
	}
    }
}

void bit_reverse(pld *a){
    for(int i=0;i<TW;i++)
	tmp[i]=a[REV[i]];
    for(int i=0;i<TW;i++)
	a[i]=tmp[i];
}

void fft(pld *a,bool rev){
    bit_reverse(a);
    for(int ln=1;ln<TW;ln*=2){
	int step=(TW/(2*ln));
	for(int st=0;st<TW;st+=ln+ln){
	    for(int i=0;i<ln;i++){
		pld x=a[st+i+ln]*w[(rev?-1:1)*step*i+(rev?TW:0)];
		a[st+i+ln]=a[st+i]-x;
		a[st+i]=a[st+i]+x;
	    }
	}
    }
    if(rev){
	for(int i=0;i<TW;i++)
	    a[i].F/=TW;
    }
}

pld p[maxn];
bool q1[maxn],q2[maxn];
vector<int>ans;

int main(){
    pre();
    int n,m;scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++){
	int x;scanf("%d",&x);
	p[x].F=q1[x]=1;
    }
    fft(p,0);
    for(int i=0;i<TW;i++)
	p[i]=p[i]*p[i];
    fft(p,1);
    for(int i=0;i<TW;i++)
	q2[i]=ll(p[i].F+0.5)>0;
    for(int i=0;i<=m;i++){
	if(!q1[i] && q2[i]){
	    printf("NO\n");
	    return 0;
	}
	if(q1[i] && !q2[i]){
	    ans.PB(i);
	}
    }
    printf("YES\n%d\n",sz(ans));
    for(int x:ans)
	printf("%d ",x);
    printf("\n");
}


#include <bits/stdc++.h>

using namespace std;

const int N = 2097155;
const double pi = acos(-1);

struct complex_t {
  double x, y;

  complex_t(double x = 0, double y = 0):x(x), y(y) {
  }

  complex_t operator + (const complex_t &b) const {
    return complex_t(x + b.x, y + b.y);
  }

  complex_t operator - (const complex_t &b) const {
    return complex_t(x - b.x, y - b.y);
  }

  complex_t operator * (const complex_t &b) const {
    return complex_t(x * b.x - y * b.y, x * b.y + y * b.x);
  }
} fft_i[N], fft_w[N], fft_x[N];

int n, m, fft_l, fft_n, fft_r[N];

void init(int n) {
  for (fft_n = 1, fft_l = 0; fft_n < n; fft_n <<= 1, ++fft_l);
  for (int i = 0; i < fft_n; ++i) {
    fft_w[i] = complex_t(cos(2 * pi * i / fft_n), sin(2 * pi * i / fft_n));
    fft_i[i] = complex_t(fft_w[i].x, -fft_w[i].y);
    fft_r[i] = fft_r[i >> 1] >> 1 | (i & 1) << fft_l - 1;
  }
}

void dft(complex_t *x, complex_t *w) {
  for (int i = 0; i < fft_n; ++i) {
    if (i < fft_r[i]) {
      swap(x[i], x[fft_r[i]]);
    }
  }
  for (int i = 1; i < fft_n; i <<= 1) {
    for (int j = 0; j < fft_n; j += i << 1) {
      for (int k = 0; k < i; ++k) {
        complex_t u = x[j + k], v = x[j + k + i] * w[fft_n / (i << 1) * k];
        x[j + k] = u + v;
        x[j + k + i] = u - v;
      }
    }
  }
}

vector<int> sqr(vector<int> a) {
  int n = a.size();
  init((n << 1) - 1);
  for (int i = 0; i < fft_n; ++i) {
    fft_x[i] = i < n ? complex_t(a[i], 0) : complex_t(0, 0);
  }
  dft(fft_x, fft_w);
  for (int i = 0; i < fft_n; ++i) {
    fft_x[i] = fft_x[i] * fft_x[i];
  }
  dft(fft_x, fft_i);
  vector<int> c(n + m - 1);
  for (int i = 0; i < n + m - 1; ++i) {
    c[i] = fft_x[i].x / fft_n + 0.5;
  }
  return c;
}

int main() {
#ifdef wxh010910
  freopen("input.txt", "r", stdin);
#endif
  scanf("%d %d", &n, &m);
  vector<int> a(m + 1, 0);
  for (int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    ++a[x];
  }
  vector<int> b = sqr(a), answer;
  for (int i = 1; i <= m; ++i) {
    if (b[i] && !a[i]) {
      puts("NO");
      return 0;
    } else if (a[i] && !b[i]) {
      answer.push_back(i);
    }
  }
  puts("YES");
  printf("%d\n", answer.size());
  for (int i = 0; i < answer.size(); ++i) {
    printf("%d%c", answer[i], i == answer.size() - 1 ? '\n' : ' ');
  }
  return 0;
}


#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
#define mset(x, y) memset(x, y, sizeof x)
#define mcpy(x, y) memcpy(x, y, sizeof x)
using namespace std;

typedef long long LL;
typedef pair <int, int> pii;

inline int Read()
{
	int x = 0, f = 1, c = getchar();
	for (; !isdigit(c); c = getchar())
		if (c == '-')
			f = -1;
	for (;  isdigit(c); c = getchar())
		x = x * 10 + c - '0';
	return x * f;
}

const int MAXN = 2097155;
const int MAXM = 25;

namespace FFT
{
	const double pi = acos(-1);

	struct E
	{
		double x, y;
		E(double _x = 0, double _y = 0) { x = _x; y = _y; }
		E operator + (const E &b) const { return E(x + b.x, y + b.y); }
		E operator - (const E &b) const { return E(x - b.x, y - b.y); }
		E operator * (const E &b) const { return E(x * b.x - y * b.y, x * b.y + y * b.x); }
		E operator / (const double &b) const { return E(x / b, y / b); }
	} wn[MAXM], x[MAXN], y[MAXN];

	int n, L, R[MAXN];

	inline void Ini(int len)
	{
		for (n = 1, L = 0; n < len; n <<= 1, L ++);
		for (int i = 1; i < n; i ++)
			R[i] = (R[i >> 1] >> 1) | ((i & 1) << L - 1);
		wn[0] = E(cos(pi / (1 << L - 1)), sin(pi / (1 << L - 1)));
		for (int i = 1; i < L; i ++)
			wn[i] = wn[i - 1] * wn[i - 1];
	}

	inline void Ini_Inv()
	{
		wn[0] = E(cos(pi / (1 << L - 1)), -sin(pi / (1 << L - 1)));
		for (int i = 1; i < L; i ++)
			wn[i] = wn[i - 1] * wn[i - 1];
	}

	inline void FFT(E *x)
	{
		for (int i = 0; i < n; i ++)
			if (i < R[i])
				swap(x[i], x[R[i]]);
		for (int i = 1, l = L - 1; i < n; i <<= 1, l --)
			for (int j = 0; j < n; j += i << 1)
			{
				E w(1, 0);
				for (int k = 0; k < i; k ++, w = w * wn[l])
				{
					E u = x[j + k], v = w * x[j + k + i];
					x[j + k] = u + v, x[j + k + i] = u - v;
				}
			}
	}

	inline void Cpy(int *x, int n, E *y, int m)
	{
		for (int i = 0; i < n; i ++)
			y[i] = E(x[i], 0);
		for (int i = n; i < m; i ++)
			y[i] = E(0, 0);
	}

	inline void Mul(int *a, int n, int *b, int m, int *ret)
	{
		Ini(n + m - 1);
		Cpy(a, n, x, FFT::n); Cpy(b, m, y, FFT::n);
		FFT(x); FFT(y);
		for (int i = 0; i < FFT::n; i ++)
			x[i] = x[i] * y[i];
		Ini_Inv();
		FFT(x);
		for (int i = 0; i < FFT::n; i ++)
			ret[i] = (x[i] / FFT::n).x + 0.5;
	}
}

int n, m, a[MAXN], b[MAXN];

int main()
{
#ifdef wxh010910
	freopen("data.in", "r", stdin);
#endif
	n = Read(), m = Read();
	for (int i = 1; i <= n; i ++)
		a[Read()] ++;
	FFT::Mul(a, m + 1, a, m + 1, b);
	int ret = 0;
	for (int i = 1; i <= m; i ++)
		if (!a[i] && b[i])
			return puts("NO"), 0;
		else if (a[i] && !b[i])
			ret ++;
	puts("YES");
	printf("%d\n", ret);
	for (int i = 1; i <= m; i ++)
		if (a[i] && !b[i])
			printf("%d ", i);
	putchar(10);
	return 0;
}


#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
#define mset(x, y) memset(x, y, sizeof x)
#define mcpy(x, y) memcpy(x, y, sizeof x)
using namespace std;

typedef long long LL;
typedef pair <int, int> pii;

inline int Read()
{
	int x = 0, f = 1, c = getchar();
	for (; !isdigit(c); c = getchar())
		if (c == '-')
			f = -1;
	for (;  isdigit(c); c = getchar())
		x = x * 10 + c - '0';
	return x * f;
}

const int MAXN = 2097155;
const int MAXM = 25;

namespace FFT
{
	const double pi = acos(-1);

	struct E
	{
		double x, y;
		E(double _x = 0, double _y = 0) { x = _x; y = _y; }
		E operator + (const E &b) const { return E(x + b.x, y + b.y); }
		E operator - (const E &b) const { return E(x - b.x, y - b.y); }
		E operator * (const E &b) const { return E(x * b.x - y * b.y, x * b.y + y * b.x); }
		E operator / (const double &b) const { return E(x / b, y / b); }
	} wn[MAXM];

	int n, L, R[MAXN];

	inline void Ini(int len)
	{
		for (n = 1, L = 0; n < len; n <<= 1, L ++);
		for (int i = 1; i < n; i ++)
			R[i] = (R[i >> 1] >> 1) | ((i & 1) << L - 1);
		wn[0] = E(cos(pi / (1 << L - 1)), sin(pi / (1 << L - 1)));
		for (int i = 1; i < L; i ++)
			wn[i] = wn[i - 1] * wn[i - 1];
	}

	inline void Ini_Inv()
	{
		wn[0] = E(cos(pi / (1 << L - 1)), -sin(pi / (1 << L - 1)));
		for (int i = 1; i < L; i ++)
			wn[i] = wn[i - 1] * wn[i - 1];
	}

	inline void FFT(E *x)
	{
		for (int i = 0; i < n; i ++)
			if (i < R[i])
				swap(x[i], x[R[i]]);
		for (int i = 1, l = L - 1; i < n; i <<= 1, l --)
			for (int j = 0; j < n; j += i << 1)
			{
				E w(1, 0);
				for (int k = 0; k < i; k ++, w = w * wn[l])
				{
					E u = x[j + k], v = w * x[j + k + i];
					x[j + k] = u + v, x[j + k + i] = u - v;
				}
			}
	}

	inline void Cpy(int *x, int n, E *y, int m)
	{
		for (int i = 0; i < n; i ++)
			y[i] = E(x[i], 0);
		for (int i = n; i < m; i ++)
			y[i] = E(0, 0);
	}

	inline void Mul(int *a, int n, int *b, int m, int *ret)
	{
		static E x[MAXN], y[MAXN];
		Ini(n + m - 1);
		Cpy(a, n, x, FFT::n); Cpy(b, m, y, FFT::n);
		FFT(x); FFT(y);
		for (int i = 0; i < FFT::n; i ++)
			x[i] = x[i] * y[i];
		Ini_Inv();
		FFT(x);
		for (int i = 0; i < FFT::n; i ++)
			ret[i] = (x[i] / FFT::n).x + 0.5;
	}
}

int n, m, a[MAXN], b[MAXN];

int main()
{
#ifdef wxh010910
	freopen("data.in", "r", stdin);
#endif
	n = Read(), m = Read();
	for (int i = 1; i <= n; i ++)
		a[Read()] ++;
	FFT::Mul(a, m + 1, a, m + 1, b);
	int ret = 0;
	for (int i = 1; i <= m; i ++)
		if (!a[i] && b[i])
			return puts("NO"), 0;
		else if (a[i] && !b[i])
			ret ++;
	puts("YES");
	printf("%d\n", ret);
	for (int i = 1; i <= m; i ++)
		if (a[i] && !b[i])
			printf("%d ", i);
	putchar(10);
	return 0;
}


#include <bits/stdc++.h>
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define rep(i,s,t) for(int i=(s),_t=(t);i<_t;++i)
#define per(i,s,t) for(int i=(t)-1,_s=(s);i>=_s;--i)
using namespace std;
typedef long long ll;
const int mod=7*17<<23|1,r=3;
void rd(int &x)
{
	x=0;
	static char c;
	while(c=getchar(),c<48);
	do x=x*10+(c^48);
		while(c=getchar(),c>47);
}
void pt(int x)
{
	if(!x)
	{
		putchar('0');
		return;
	}
	static char stk[35];
	int tp=0;
	for(;x;x/=10)stk[tp++]=x%10;
	per(i,0,tp)putchar(stk[i]^48);
}
inline void ptn(int x)
{
	pt(x),putchar('\n');
}
inline void mod_add(int &a,int b)
{
	if((a+=b)>=mod)a-=mod;
}
inline void mod_minus(int &a,int b)
{
	if((a-=b)<0)a+=mod;
}
int mod_pow(int a,int b)
{
	int res=1;
	for(;b;b>>=1,a=(ll)a*a%mod)
		if(b&1)res=(ll)res*a%mod;
	return res;
}

const int N=1<<20;

bool org[N];
int m,arr[N],rev[N];

void NTT(bool type)
{
	rep(i,0,N)if(i<rev[i])swap(arr[i],arr[rev[i]]);
	for(int m=2;m<=N;m<<=1)
	{
		int gm=mod_pow(r,(mod-1)/m);
		if(type)gm=mod_pow(gm,mod-2);
		for(int i=0;i<N;i+=m)
		{
			int g=1;
			rep(j,0,m>>1)
			{
				int x=arr[i+j],y=(ll)g*arr[i+j+(m>>1)]%mod;
				mod_add(arr[i+j]=x,y);
				mod_minus(arr[i+j+(m>>1)]=x,y);
				g=(ll)g*gm%mod;
			}
		}
	}
	if(type)for(int i=0,inv=mod_pow(N,mod-2);i<N;++i)arr[i]=(ll)arr[i]*inv%mod;
}

bool valid()
{
	rep(i,1,m+1)if(!org[i]&&arr[i])
	{
		puts("NO");
		return false;
	}
	puts("YES");
	return true;
}

int main()
{
	int n;
	rd(n),rd(m);
	for(int elm;n--;)
	{
		rd(elm);
		arr[elm]=org[elm]=true;
	}
	rep(i,1,N)rev[i]=rev[i>>1]>>1|(i&1)<<19;
	NTT(0);
	rep(i,0,N)arr[i]=(ll)arr[i]*arr[i]%mod;
	NTT(1);
	if(valid())
	{
		int tot=0;
		static int ans[N];
		rep(i,1,m+1)if(org[i]&&!arr[i])ans[tot++]=i;
		ptn(tot);
		rep(i,0,tot)pt(ans[i]),putchar(" \n"[i==tot-1]);
	}
	return 0;
}


#include <bits/stdc++.h>
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define rep(i,s,t) for(int i=(s),_t=(t);i<_t;++i)
#define per(i,s,t) for(int i=(t)-1,_s=(s);i>=_s;--i)
using namespace std;
typedef long long ll;
const int mod=7*17<<23|1,r=3;
void rd(int &x)
{
	x=0;
	static char c;
	while(c=getchar(),c<48);
	do x=x*10+(c^48);
		while(c=getchar(),c>47);
}
void pt(int x)
{
	if(!x)
	{
		putchar('0');
		return;
	}
	static char stk[35];
	int tp=0;
	for(;x;x/=10)stk[tp++]=x%10;
	per(i,0,tp)putchar(stk[i]^48);
}
inline void ptn(int x)
{
	pt(x),putchar('\n');
}
inline void mod_add(int &a,int b)
{
	if((a+=b)>=mod)a-=mod;
}
inline void mod_minus(int &a,int b)
{
	if((a-=b)<0)a+=mod;
}
int mod_pow(int a,int b)
{
	int res=1;
	for(;b;b>>=1,a=(ll)a*a%mod)
		if(b&1)res=(ll)res*a%mod;
	return res;
}

const int N=1<<21;

bool org[N];
int m,arr[N],rev[N];

void NTT(bool type)
{
	rep(i,0,N)if(i<rev[i])swap(arr[i],arr[rev[i]]);
	for(int m=2;m<=N;m<<=1)
	{
		int gm=mod_pow(r,(mod-1)/m);
		if(type)gm=mod_pow(gm,mod-2);
		for(int i=0;i<N;i+=m)
		{
			int g=1;
			rep(j,0,m>>1)
			{
				int x=arr[i+j],y=(ll)g*arr[i+j+(m>>1)]%mod;
				mod_add(arr[i+j]=x,y);
				mod_minus(arr[i+j+(m>>1)]=x,y);
				g=(ll)g*gm%mod;
			}
		}
	}
	if(type)for(int i=0,inv=mod_pow(N,mod-2);i<N;++i)arr[i]=(ll)arr[i]*inv%mod;
}

bool valid()
{
	rep(i,1,m+1)if(!org[i]&&arr[i])
	{
		puts("NO");
		return false;
	}
	puts("YES");
	return true;
}

int main()
{
	int n;
	rd(n),rd(m);
	for(int elm;n--;)
	{
		rd(elm);
		arr[elm]=org[elm]=true;
	}
	rep(i,1,N)rev[i]=rev[i>>1]>>1|(i&1)<<20;
	NTT(0);
	rep(i,0,N)arr[i]=(ll)arr[i]*arr[i]%mod;
	NTT(1);
	if(valid())
	{
		int tot=0;
		static int ans[N];
		rep(i,1,m+1)if(org[i]&&!arr[i])ans[tot++]=i;
		ptn(tot);
		rep(i,0,tot)pt(ans[i]),putchar(" \n"[i==tot-1]);
	}
	return 0;
}


#include <bits/stdc++.h>

#define debug(x) cout << #x << " = " << x << endl
#define fori(i, ini, lim) for(int i = int(ini); i < int(lim); i++)
#define ford(i, ini, lim) for(int i = int(ini); i >= int(lim); i--)

using namespace std;

typedef long long ll;
typedef pair<int, int> ii;

namespace FFT {
	typedef complex<double> base;

	const double C_PI = acos(-1);
	void fft(vector<base> &a, bool invert) {
		int n = a.size();
		for(int i = 0, j = 0; i < n; ++i) {
			if(i > j) {
				swap(a[i], a[j]);
			}
			for(int k = n / 2; (j ^= k) < k; k /= 2);
		}
		for(int len = 2; len <= n; len *= 2) {
			double ang = 2 * C_PI / len * (invert ? -1 : 1);
			base wlen(cos(ang), sin(ang));
			for(int i = 0; i < n; i += len) {
				base w(1);
				fori(j, 0, len / 2) {
					if((j & 511) == 511) {
						w = base(cos(ang * j), sin(ang * j));
					}
					base u = a[i + j], v = a[i + j + len / 2] * w;
					a[i + j] = u + v;
					a[i + j + len / 2] = u - v;
					w *= wlen;
				}
			}
		}
		if(invert) {
			fori(i, 0, n) {
				a[i] /= n;
			}
		}
	}

	vector<int> multiply(const vector<int> &a, const vector<int> &b, const int MOD) {
		vector<base> fa(a.begin(), a.end()), fb(b.begin(), b.end());
		int n = 1;
		while(n < (int) max(a.size(), b.size())) {
			n *= 2;
		}
		n *= 2;
		fa.resize(n);
		fb.resize(n);
		fft(fa, false);
		fft(fb, false);
		fori(i, 0, n) {
			fa[i] *= fb[i];
		}
		fft(fa, true);
		vector<int> res;
		res.resize(n);
		fori(i, 0, n) {
			res[i] = ((ll) (fa[i].real() + (fa[i].real() > 0 ? 0.5 : -0.5))) % MOD;
			res[i] = res[i] != 0;
		}
		return res;
	}
}

const int MOD = 1e9 + 7;
const int MAX = 1e6 + 6;
int n, m;

int main() {
	scanf("%d %d", &n, &m);
	vector<int> P(m + 1, 0);
	fori(i, 1, n + 1) {
		int cur;
		scanf("%d", &cur);
		P[cur] = 1;
	}

	vector<int> F = FFT::multiply(P, P, MOD);
	vector<int> ans;
	fori(i, 0, min(m + 1, (int) F.size())) {
		if(!P[i] && F[i]) {
			puts("NO");
			return 0;
		}
		if(P[i] && !F[i]) {
			ans.push_back(i);
		}
	}

	puts("YES");
	printf("%d\n", (int) ans.size());
	for(auto &each : ans) {
		printf("%d ", each);
	}
	puts("");

	return 0;
}


/*
srt: 2017年03月29日 08時45分56秒
		《小重山·七夕病中》吕渭老
半夜灯残鼠上檠。上窗风动竹，月微明。梦魂偏记水西亭。琅玕碧，花影弄蜻蜓。
	千里暮云平，南楼催上烛，晚来晴。酒阑人散斗西倾。天如水，团扇扑流萤。
end: 2017年03月29日 10時10分35秒
*/

#include<cstdio>
#include<cmath>
inline void read(int&r)
{
	register char c;r=0;
	do c=getchar();while(c<'0'||c>'9');
	do r=r*10+c-'0',c=getchar();while(c>='0'&&c<='9');
}

const double pi=3.14159265358979323846,cmp=0.99999;
struct comp{ double x,y;comp(){}comp(double x,double y):x(x),y(y){} }a[2097152],w[2097153];int p[2097153],n;
inline comp operator*(const comp&a,const comp&b){ return comp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); }
inline comp operator-(const comp&a,const comp&b){ return comp(a.x-b.x,a.y-b.y); }
inline comp operator*(const comp&a,const double&k){ return comp(a.x*k,a.y*k); }
inline comp&operator+=(comp&a,const comp&b){ a.x+=b.x,a.y+=b.y;return a; }
inline comp&operator*=(comp&a,const double&k){ a.x*=k,a.y*=k;return a; }
inline comp&operator*=(comp&a,const comp&b){ return a=a*b; }

void dft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[i*j],
				a[m+i]=a[l+i]-a[m+i]*2;
}

void idft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[n-i*j],
				a[m+i]=(a[l+i]*=.5)-a[m+i];
}

bool o[1000001];
int c[1000001],top;
int main()
{
	int m,i;w[0].x=1;read(n),read(m);
	while(n--)read(i),o[i]=true,a[i].x=1;
	for(n=1;n<=m<<1;n<<=1);
	comp t(cos(pi*2/n),sin(pi*2/n));
	for(i=1;i<=n;i++)p[i]=p[i>>1]>>1,i&1&&(p[i]|=n>>1),w[i]=w[i-1]*t;

	dft();
	for(i=0;i<n;i++)a[i]*=a[i];
	idft();
	for(i=0;i<=m;i++)
		if((a[i].x>cmp)^o[i])
			if(o[i])
				c[top++]=i;
			else
				return puts("NO"),0;

	printf("YES\n%d\n",top);
	for(i=0;i<top;i++)
		printf("%d ",c[i]);
}


/*
srt: 2017年03月29日 08時45分56秒
		《小重山·七夕病中》吕渭老
半夜灯残鼠上檠。上窗风动竹，月微明。梦魂偏记水西亭。琅玕碧，花影弄蜻蜓。
	千里暮云平，南楼催上烛，晚来晴。酒阑人散斗西倾。天如水，团扇扑流萤。
end: 2017年03月29日 10時10分35秒
*/

#include<cstdio>
#include<cmath>
inline void read(int&r)
{
	register char c;r=0;
	do c=getchar();while(c<'0'||c>'9');
	do r=r*10+c-'0',c=getchar();while(c>='0'&&c<='9');
}

const double pi=3.14159265358979323846,cmp=0.5;
struct comp{ double x,y;comp(){}comp(double x,double y):x(x),y(y){} }a[2097152],w[2097153];int p[2097153],n;
inline comp operator*(const comp&a,const comp&b){ return comp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); }
inline comp operator-(const comp&a,const comp&b){ return comp(a.x-b.x,a.y-b.y); }
inline comp operator*(const comp&a,const double&k){ return comp(a.x*k,a.y*k); }
inline comp&operator+=(comp&a,const comp&b){ a.x+=b.x,a.y+=b.y;return a; }
inline comp&operator*=(comp&a,const double&k){ a.x*=k,a.y*=k;return a; }
inline comp&operator*=(comp&a,const comp&b){ return a=a*b; }

void dft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[i*j],
				a[m+i]=a[l+i]-a[m+i]*2;
}

void idft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[n-i*j],
				a[m+i]=(a[l+i]*=.5)-a[m+i];
}

bool o[1000001];
int c[1000001],top;
int main()
{
	int m,i;w[0].x=1;read(n),read(m);
	while(n--)read(i),o[i]=true,a[i].x=1;
	for(n=1;n<=m<<1;n<<=1);
	comp t(cos(pi*2/n),sin(pi*2/n));
	for(i=1;i<=n;i++)p[i]=p[i>>1]>>1,i&1&&(p[i]|=n>>1),w[i]=w[i-1]*t;

	dft();
	for(i=0;i<n;i++)a[i]*=a[i];
	idft();
	for(i=0;i<=m;i++)
		if((a[i].x>cmp)^o[i])
			if(o[i])
				c[top++]=i;
			else
				return puts("NO"),0;

	printf("YES\n%d\n",top);
	for(i=0;i<top;i++)
		printf("%d ",c[i]);
}


/*
srt: 2017年03月29日 08時45分56秒
		《小重山·七夕病中》吕渭老
半夜灯残鼠上檠。上窗风动竹，月微明。梦魂偏记水西亭。琅玕碧，花影弄蜻蜓。
	千里暮云平，南楼催上烛，晚来晴。酒阑人散斗西倾。天如水，团扇扑流萤。
end: 2017年03月29日 10時10分35秒
*/

#include<cstdio>
#include<cmath>
inline void read(int&r)
{
	register char c;r=0;
	do c=getchar();while(c<'0'||c>'9');
	do r=r*10+c-'0',c=getchar();while(c>='0'&&c<='9');
}

const double pi=3.14159265358979323846,cmp=0.999999999999;
struct comp{ double x,y;comp(){}comp(double x,double y):x(x),y(y){} }a[2097152],w[2097153];int p[2097153],n;
inline comp operator*(const comp&a,const comp&b){ return comp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); }
inline comp operator-(const comp&a,const comp&b){ return comp(a.x-b.x,a.y-b.y); }
inline comp operator*(const comp&a,const double&k){ return comp(a.x*k,a.y*k); }
inline comp&operator+=(comp&a,const comp&b){ a.x+=b.x,a.y+=b.y;return a; }
inline comp&operator*=(comp&a,const double&k){ a.x*=k,a.y*=k;return a; }
inline comp&operator*=(comp&a,const comp&b){ return a=a*b; }

void dft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[i*j],
				a[m+i]=a[l+i]-a[m+i]*2;
}

void idft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[n-i*j],
				a[m+i]=(a[l+i]*=.5)-a[m+i];
}

bool o[1000001];
int c[1000001],top;
int main()
{
	int m,i;w[0].x=1;read(n),read(m);
	while(n--)read(i),o[i]=true,a[i].x=1;
	for(n=1;n<=m<<1;n<<=1);
	comp t(cos(pi*2/n),sin(pi*2/n));
	for(i=1;i<=n;i++)p[i]=p[i>>1]>>1,i&1&&(p[i]|=n>>1),w[i]=w[i-1]*t;

	dft();
	for(i=0;i<n;i++)a[i]*=a[i];
	idft();
	for(i=0;i<=m;i++)
		if((a[i].x>cmp)^o[i])
			if(o[i])
				c[top++]=i;
			else
				return puts("NO"),0;

	printf("YES\n%d\n",top);
	for(i=0;i<top;i++)
		printf("%d ",c[i]);
}


/*
srt: 2017年03月29日 08時45分56秒
		《小重山·七夕病中》吕渭老
半夜灯残鼠上檠。上窗风动竹，月微明。梦魂偏记水西亭。琅玕碧，花影弄蜻蜓。
	千里暮云平，南楼催上烛，晚来晴。酒阑人散斗西倾。天如水，团扇扑流萤。
end: 2017年03月29日 10時10分35秒
*/

#include<cstdio>
#include<cmath>
inline void read(int&r)
{
	register char c;r=0;
	do c=getchar();while(c<'0'||c>'9');
	do r=r*10+c-'0',c=getchar();while(c>='0'&&c<='9');
}

const double pi=3.14159265358979323846,cmp=0.9999999999;
struct comp{ double x,y;comp(){}comp(double x,double y):x(x),y(y){} }a[2097152],w[2097153];int p[2097153],n;
inline comp operator*(const comp&a,const comp&b){ return comp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x); }
inline comp operator-(const comp&a,const comp&b){ return comp(a.x-b.x,a.y-b.y); }
inline comp operator*(const comp&a,const double&k){ return comp(a.x*k,a.y*k); }
inline comp&operator+=(comp&a,const comp&b){ a.x+=b.x,a.y+=b.y;return a; }
inline comp&operator*=(comp&a,const double&k){ a.x*=k,a.y*=k;return a; }
inline comp&operator*=(comp&a,const comp&b){ return a=a*b; }

void dft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[i*j],
				a[m+i]=a[l+i]-a[m+i]*2;
}

void idft()
{
	int k,i=0,j,l,m;
	for(comp t;i<n;i++)
		if(p[i]>i)
			t=a[i],a[i]=a[p[i]],a[p[i]]=t;
	for(k=1;k<n;k<<=1)
		for(l=0,m=k,j=n/k/2;l<n;l=m+k,m=l+k)
			for(i=0;i<k;i++)
				a[l+i]+=a[m+i]*=w[n-i*j],
				a[m+i]=(a[l+i]*=.5)-a[m+i];
}

bool o[1000001];
int c[1000001],top;
int main()
{
	int m,i;w[0].x=1;read(n),read(m);
	while(n--)read(i),o[i]=true,a[i].x=1;
	for(n=1;n<=m<<1;n<<=1);
	comp t(cos(pi*2/n),sin(pi*2/n));
	for(i=1;i<=n;i++)p[i]=p[i>>1]>>1,i&1&&(p[i]|=n>>1),w[i]=w[i-1]*t;

	dft();
	for(i=0;i<n;i++)a[i]*=a[i];
	idft();
	for(i=0;i<=m;i++)
		if((a[i].x>cmp)^o[i])
			if(o[i])
				c[top++]=i;
			else
				return puts("NO"),0;

	printf("YES\n%d\n",top);
	for(i=0;i<top;i++)
		printf("%d ",c[i]);
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXSIZE=30000020;
int bufpos;
char buf[MAXSIZE];
#define NEG 0
void init(){
	#ifdef LOCAL
		freopen("286E.txt","r",stdin);
	#endif
	buf[fread(buf,1,MAXSIZE,stdin)]='\0';
	bufpos=0;
}
#if NEG
int readint(){
	bool isneg;
	int val=0;
	for(;!isdigit(buf[bufpos]) && buf[bufpos]!='-';bufpos++);
	bufpos+=(isneg=buf[bufpos]=='-');
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return isneg?-val:val;
}
#else
int readint(){
	int val=0;
	for(;!isdigit(buf[bufpos]);bufpos++);
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return val;
}
#endif
char readchar(){
	for(;isspace(buf[bufpos]);bufpos++);
	return buf[bufpos++];
}
int readstr(char* s){
	int cur=0;
	for(;isspace(buf[bufpos]);bufpos++);
	for(;!isspace(buf[bufpos]);bufpos++)
		s[cur++]=buf[bufpos];
	s[cur]='\0';
	return cur;
}
typedef double db;
struct cp{
	db a,b;
	cp(db a=0,db b=0):a(a),b(b){}
	cp& operator +=(const cp& rhs){
		a+=rhs.a,b+=rhs.b;
		return *this;
	}
	cp operator +(const cp& rhs)const{
		cp ans=*this;
		ans+=rhs;
		return ans;
	}
	cp& operator -=(const cp& rhs){
		a-=rhs.a,b-=rhs.b;
		return *this;
	}
	cp operator -(const cp& rhs)const{
		cp ans=*this;
		ans-=rhs;
		return ans;
	}
	cp& operator *=(const cp& rhs){
		db t=a;
		a=a*rhs.a-b*rhs.b;
		b=t*rhs.b+b*rhs.a;
		return *this;
	}
	cp operator *(const cp& rhs)const{
		cp ans=*this;
		ans*=rhs;
		return ans;
	}
	cp& operator /=(const db& rhs){
		a/=rhs,b/=rhs;
		return *this;
	}
	cp operator /(const db& rhs)const{
		cp ans=*this;
		ans/=rhs;
		return ans;
	}
	inline db real(){
		return a;
	}
};
const int maxn=(1<<21)+3;
const db pi=acos(-1.0);
struct fft{
	int n,k;
	int bitrev[maxn];
	cp omega[maxn];
	void init(int len){
		n=1,k=0;
		while(n<len)
			n<<=1,k++;
		omega[0]=1;
		for(int i=1;i<n;i++){
			omega[i]=cp(cos(2*pi*i/n),sin(2*pi*i/n));
			bitrev[i]=(bitrev[i>>1]>>1)|((i&1)<<(k-1));
		}
	}
	cp wn[maxn];
	void trans(cp* a,bool rev){
		for(int i=0;i<n;i++)
			if (bitrev[i]<i)
				swap(a[i],a[bitrev[i]]);
		for(int i=1,qwq=k-1;i<n;i<<=1,qwq--){
			for(int j=0;j<i;j++)
				wn[j]=omega[j<<qwq];
			for(int j=0;j<n;j+=(i<<1))
				for(int k=j;k<j+i;k++){
					cp t=wn[k-j]*a[k+i];
					a[k+i]=a[k]-t;
					a[k]=a[k]+t;
				}
		}
		if (rev){
			reverse(a+1,a+n);
			for(int i=0;i<n;i++)
				a[i]/=n;
		}
	}
}t;
cp tmp[maxn];
void inv(cp *f,cp *g,int n){ //[0,n)
	int now=1;
	db qwq=f[0].a*f[0].a-f[0].b*f[0].b;
	g[0]=f[0]*qwq;
	g[0].b=-g[0].b;
	for(int i=1;i<n*2;i++)
		g[i]=0;
	// fprintf(stderr,"g[%d]=%lld\n",0,g[0]);
	while(now<n){
		now*=2;
		//mod (x^now)
		t.init(now*2);
		for(int i=0;i<t.n;i++)
			tmp[i]=0;
		for(int i=0;i<now;i++)
			tmp[i]=f[i];
		t.trans(tmp,0);
		t.trans(g,0);
		for(int i=0;i<t.n;i++){
			cp qwq=tmp[i]*g[i];
			qwq.a=2.0-qwq.a;
			g[i]*=qwq;
		}
		t.trans(g,1);
		for(int i=now;i<t.n;i++)
			g[i]=0;
	}
}
void ln(cp *f,cp *g,int n){
	inv(f,g,n);
	/*for(int i=0;i<n;i++)
		printf("%lld ",invf[i]);
	puts("");*/
	for(int i=0;i<n;i++)
		tmp[i]=f[i+1]*(i+1.0);
	t.init(n*2); //fw*invf
	for(int i=n;i<t.n;i++)
		tmp[i]=0;
	t.trans(g,0);
	t.trans(tmp,0);
	for(int i=0;i<t.n;i++)
		g[i]=g[i]*tmp[i];
	t.trans(g,1);
	for(int i=n-2;i>=0;i--)
		g[i+1]=g[i]/(i+1.0);
	g[0]=0;
}
void exp(cp *f,cp *g,int n){
	static cp lng[maxn];
	for(int i=0;i<2*n;i++)
		lng[i]=0;
	g[0]=1;
	for(int i=1;i<2*n;i++)
		g[i]=0;
	int now=1;
	while(now<n){
		now*=2;
		//mod x^now;
		ln(g,lng,now);
		// t.init(2*now);
		for(int i=0;i<now;i++)
			tmp[i]=f[i];
		for(int i=now;i<t.n;i++)
			tmp[i]=lng[i]=0;
		t.trans(tmp,0);
		t.trans(lng,0);
		t.trans(g,0);
		for(int i=0;i<t.n;i++)
			g[i]*=(tmp[i]+1.0-lng[i]);
		t.trans(g,1);
		for(int i=now;i<t.n;i++)
			g[i]=0;
	}
}
cp f[maxn],g[maxn];
int a[maxn];
bool app[maxn];
int ans[maxn];
int main(){
	init();
	// t.test();
	int n=readint(),m=readint();
	for(int i=1;i<=n;i++)
		a[i]=readint(),app[a[i]]=1;
	int k=1;
	while(k<=m)
		k<<=1;
	f[0]=1,f[1]=-1;
	ln(f,g,k);
	memset(f,0,sizeof(f));
	for(int i=1;i<=n;i++)
		for(int j=0,now=0;j<=k;j+=a[i],now++)
			f[j]-=g[now];
	exp(f,g,k);
	for(int i=1;i<=m;i++)
		if (!app[i] && (int)(g[i].real()+0.5))
			return puts("NO"),0;
	int cur=0;
	for(int i=1;i<=m;i++)
		if (((int)(g[i].real()+0.5))==1)
			ans[++cur]=i;
	puts("YES");
	printf("%d\n",cur);
	for(int i=1;i<=cur;i++)
		printf("%d ",ans[i]);
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXSIZE=30000020;
int bufpos;
char buf[MAXSIZE];
#define NEG 0
void init(){
	#ifdef LOCAL
		freopen("286E.txt","r",stdin);
	#endif
	buf[fread(buf,1,MAXSIZE,stdin)]='\0';
	bufpos=0;
}
#if NEG
int readint(){
	bool isneg;
	int val=0;
	for(;!isdigit(buf[bufpos]) && buf[bufpos]!='-';bufpos++);
	bufpos+=(isneg=buf[bufpos]=='-');
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return isneg?-val:val;
}
#else
int readint(){
	int val=0;
	for(;!isdigit(buf[bufpos]);bufpos++);
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return val;
}
#endif
char readchar(){
	for(;isspace(buf[bufpos]);bufpos++);
	return buf[bufpos++];
}
int readstr(char* s){
	int cur=0;
	for(;isspace(buf[bufpos]);bufpos++);
	for(;!isspace(buf[bufpos]);bufpos++)
		s[cur++]=buf[bufpos];
	s[cur]='\0';
	return cur;
}
typedef double db;
struct cp{
	db x,y;
	cp(db x=0,db y=0):x(x),y(y){}
	cp operator +(const cp& rhs)const{
		return cp(x+rhs.x,y+rhs.y);
	}
	cp operator +=(const cp& rhs){
		return *this=*this+rhs;
	}
	cp operator -(const cp& rhs)const{
		return cp(x-rhs.x,y-rhs.y);
	}
	cp operator -=(const cp& rhs){
		return *this=*this-rhs;
	}
	cp operator *(const cp& rhs)const{
		return cp(x*rhs.x-y*rhs.y,x*rhs.y+y*rhs.x);
	}
	cp operator *=(const cp& rhs){
		return *this=*this*rhs;
	}
	cp operator /(const db& rhs)const{
		return cp(x/rhs,y/rhs);
	}
	cp operator /=(const db& rhs){
		return *this=*this/rhs;
	}
	inline db real(){
		return x;
	}
};
// typedef complex<db> cp;
const int maxn=(1<<21)+3;
const db pi=acos(-1.0);
struct fft{
	int n,k;
	int bitrev[maxn];
	cp omega[maxn];
	void init(int len){
		n=1,k=0;
		while(n<=len)
			n<<=1,k++;
		omega[0]=1;
		for(int i=1;i<n;i++){
			omega[i]=cp(cos(2*pi*i/n),sin(2*pi*i/n));
			bitrev[i]=(bitrev[i>>1]>>1)|((i&1)<<(k-1));
		}
	}
	cp wn[maxn];
	void trans(cp* a,bool rev){
		for(int i=0;i<n;i++)
			if (bitrev[i]<i)
				swap(a[i],a[bitrev[i]]);
		for(int i=1,qwq=k-1;i<n;i<<=1,qwq--){
			for(int j=0;j<i;j++)
				wn[j]=omega[j<<qwq];
			for(int j=0;j<n;j+=(i<<1))
				for(int k=j;k<j+i;k++){
					cp t=wn[k-j]*a[k+i];
					a[k+i]=a[k]-t;
					a[k]=a[k]+t;
				}
		}
		if (rev){
			reverse(a+1,a+n);
			for(int i=0;i<n;i++)
				a[i]/=n;
		}
	}
	void test(){
		static cp a[maxn],b[maxn];
		init(7);
		a[0]=a[1]=1;
		b[0]=b[2]=1,b[1]=2;
		trans(a,0);
		trans(b,0);
		for(int i=0;i<n;i++)
			a[i]*=b[i];
		trans(a,1);
		for(int i=0;i<n;i++)
			printf("a[%d]=%d\n",i,(int)(a[i].real()+0.5));
	}
}t;
cp g[maxn];
int a[maxn];
bool app[maxn];
int ans[maxn];
int main(){
	init();
	int n=readint(),m=readint();
	for(int i=1;i<=n;i++){
		a[i]=readint();
		app[a[i]]=1;
		g[a[i]]=1;
	}
	g[0]=1;
	t.init(2*m);
	t.trans(g,0);
	for(int i=0;i<t.n;i++)
		g[i]*=g[i];
	t.trans(g,1);
	for(int i=1;i<=m;i++)
		if (!app[i] && (int)(g[i].real()+0.5)){
			// printf("%d %.5f\n",i,g[i].real());
			return puts("NO"),0;
		}
	int cur=0;
	for(int i=1;i<=m;i++)
		if (((int)(g[i].real()+0.5))==2){
			ans[++cur]=i;
			// printf("%.5f\n",g[i].real());
		}
	puts("YES");
	printf("%d\n",cur);
	for(int i=1;i<=cur;i++)
		printf("%d ",ans[i]);
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXSIZE=30000020;
int bufpos;
char buf[MAXSIZE];
#define NEG 0
void init(){
	#ifdef LOCAL
		freopen("286E.txt","r",stdin);
	#endif
	buf[fread(buf,1,MAXSIZE,stdin)]='\0';
	bufpos=0;
}
#if NEG
int readint(){
	bool isneg;
	int val=0;
	for(;!isdigit(buf[bufpos]) && buf[bufpos]!='-';bufpos++);
	bufpos+=(isneg=buf[bufpos]=='-');
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return isneg?-val:val;
}
#else
int readint(){
	int val=0;
	for(;!isdigit(buf[bufpos]);bufpos++);
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return val;
}
#endif
char readchar(){
	for(;isspace(buf[bufpos]);bufpos++);
	return buf[bufpos++];
}
int readstr(char* s){
	int cur=0;
	for(;isspace(buf[bufpos]);bufpos++);
	for(;!isspace(buf[bufpos]);bufpos++)
		s[cur++]=buf[bufpos];
	s[cur]='\0';
	return cur;
}
typedef double db;
struct cp{
    db x,y;
    cp(db x=0,db y=0):x(x),y(y){}
	cp operator +(const cp& rhs)const{
        return cp(x+rhs.x,y+rhs.y);
    }
    cp operator +=(const cp& rhs){
        return *this=*this+rhs;
    }
	cp operator -(const cp& rhs)const{
        return cp(x-rhs.x,y-rhs.y);
    }
    cp operator -=(const cp& rhs){
        return *this=*this-rhs;
    }
    cp operator *(const cp& rhs)const{
        return cp(x*rhs.x-y*rhs.y,x*rhs.y+y*rhs.x);
    }
    cp operator *=(const cp& rhs){
        return *this=*this*rhs;
    }
    cp operator /(const db& rhs)const{
        return cp(x/rhs,y/rhs);
    }
    cp operator /=(const db& rhs){
        return *this=*this/rhs;
    }
	inline db real(){
		return x;
	}
};
// typedef complex<db> cp;
const int maxn=(1<<21)+3;
const db pi=acos(-1.0);
struct fft{
	int n,k;
	int bitrev[maxn];
	cp omega[maxn];
	void init(int len){
		n=1,k=0;
		while(n<=len)
			n<<=1,k++;
		omega[0]=1;
		for(int i=1;i<n;i++){
			omega[i]=cp(cos(2*pi*i/n),sin(2*pi*i/n));
			bitrev[i]=(bitrev[i>>1]>>1)|((i&1)<<(k-1));
		}
	}
	cp wn[maxn];
	void trans(cp* a,bool rev){
		for(int i=0;i<n;i++)
			if (bitrev[i]<i)
				swap(a[i],a[bitrev[i]]);
		for(int i=1,qwq=k-1;i<n;i<<=1,qwq--){
			for(int j=0;j<i;j++)
				wn[j]=omega[j<<qwq];
			for(int j=0;j<n;j+=(i<<1))
				for(int k=j;k<j+i;k++){
					cp t=wn[k-j]*a[k+i];
					a[k+i]=a[k]-t;
					a[k]=a[k]+t;
				}
		}
		if (rev){
			reverse(a+1,a+n);
			for(int i=0;i<n;i++)
				a[i]/=n;
		}
	}
	void test(){
		static cp a[maxn],b[maxn];
		init(7);
		a[0]=a[1]=1;
		b[0]=b[2]=1,b[1]=2;
		trans(a,0);
		trans(b,0);
		for(int i=0;i<n;i++)
			a[i]*=b[i];
		trans(a,1);
		for(int i=0;i<n;i++)
			printf("a[%d]=%d\n",i,(int)(a[i].real()+0.5));
	}
}t;
cp g[maxn];
int a[maxn];
bool app[maxn];
int ans[maxn];
int main(){
	init();
	int n=readint(),m=readint();
	for(int i=1;i<=n;i++){
		a[i]=readint();
		app[a[i]]=1;
		g[a[i]]=1;
	}
	g[0]=1;
	t.init(2*m);
	t.trans(g,0);
	for(int i=0;i<t.n;i++)
		g[i]*=g[i];
	t.trans(g,1);
	for(int i=1;i<=m;i++)
		if (!app[i] && (int)(g[i].real()+0.5)){
			printf("%d %.5f\n",i,g[i].real());
			return puts("NO"),0;
		}
	int cur=0;
	for(int i=1;i<=m;i++)
		if (((int)(g[i].real()+0.5))==2){
			ans[++cur]=i;
			// printf("%.5f\n",g[i].real());
		}
	puts("YES");
	printf("%d\n",cur);
	for(int i=1;i<=cur;i++)
		printf("%d ",ans[i]);
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXSIZE=10000020;
const ll INF=0x3f3f3f3f3f3f3f3fLL;
int bufpos;
char buf[MAXSIZE];
#define NEG 0
void init(){
	#ifdef LOCAL
		freopen("663E.txt","r",stdin);
	#endif
	buf[fread(buf,1,MAXSIZE,stdin)]='\0';
	bufpos=0;
}
#if NEG
int readint(){
	bool isneg;
	int val=0;
	for(;!isdigit(buf[bufpos]) && buf[bufpos]!='-';bufpos++);
	bufpos+=(isneg=buf[bufpos]=='-');
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return isneg?-val:val;
}
#else
int readint(){
	int val=0;
	for(;!isdigit(buf[bufpos]);bufpos++);
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return val;
}
#endif
char readchar(){
	for(;isspace(buf[bufpos]);bufpos++);
	return buf[bufpos++];
}
int readstr(char* s){
	int cur=0;
	for(;isspace(buf[bufpos]);bufpos++);
	for(;!isspace(buf[bufpos]);bufpos++)
		s[cur++]=buf[bufpos];
	s[cur]='\0';
	return cur;
}
void fwt(ll *a,int l,int r){
	if (l==r)
		return;
	int mid=(l+r)/2,k=mid-l+1;
	for(int i=l;i<=mid;i++){
		ll t=a[i+k];
		a[i+k]=a[i]-t;
		a[i]+=t;
	}
	fwt(a,l,mid);
	fwt(a,mid+1,r);
}
ll a[1<<20],b[1<<20];
int tmp[100002];
int main(){
	init();
	int n=readint(),m=readint(),k=(1<<n)-1;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			tmp[j]|=(readchar()-'0')<<i;
	for(int i=0;i<m;i++)
		a[tmp[i]]++;
	fwt(a,0,k);
	for(int i=0;i<=k;i++){
		int qwq=__builtin_popcount(i);
		b[i]=min(qwq,n-qwq);
	}
	fwt(b,0,k);
	for(int i=0;i<=k;i++){
		a[i]*=b[i];
		// printf("a[%d]=%lld\n",i,a[i]);
	}
	fwt(a,0,k);
	ll ans=INF;
	for(int i=0;i<m;i++)
		ans=min(ans,a[i]);
	printf("%lld",ans>>n);
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXSIZE=30000020;
int bufpos;
char buf[MAXSIZE];
#define NEG 0
void init(){
	#ifdef LOCAL
		freopen("286E.txt","r",stdin);
	#endif
	buf[fread(buf,1,MAXSIZE,stdin)]='\0';
	bufpos=0;
}
#if NEG
int readint(){
	bool isneg;
	int val=0;
	for(;!isdigit(buf[bufpos]) && buf[bufpos]!='-';bufpos++);
	bufpos+=(isneg=buf[bufpos]=='-');
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return isneg?-val:val;
}
#else
int readint(){
	int val=0;
	for(;!isdigit(buf[bufpos]);bufpos++);
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return val;
}
#endif
char readchar(){
	for(;isspace(buf[bufpos]);bufpos++);
	return buf[bufpos++];
}
int readstr(char* s){
	int cur=0;
	for(;isspace(buf[bufpos]);bufpos++);
	for(;!isspace(buf[bufpos]);bufpos++)
		s[cur++]=buf[bufpos];
	s[cur]='\0';
	return cur;
}
typedef double db;
struct cp{
	db a,b;
	cp(db a=0,db b=0):a(a),b(b){}
	cp& operator +=(const cp& rhs){
		a+=rhs.a,b+=rhs.b;
		return *this;
	}
	cp operator +(const cp& rhs)const{
		cp ans=*this;
		ans+=rhs;
		return ans;
	}
	cp& operator -=(const cp& rhs){
		a-=rhs.a,b-=rhs.b;
		return *this;
	}
	cp operator -(const cp& rhs)const{
		cp ans=*this;
		ans-=rhs;
		return ans;
	}
	cp& operator *=(const cp& rhs){
		db t=a;
		a=a*rhs.a-b*rhs.b;
		b=t*rhs.b+b*rhs.a;
		return *this;
	}
	cp operator *(const cp& rhs)const{
		cp ans=*this;
		ans*=rhs;
		return ans;
	}
	cp& operator /=(const db& rhs){
		a/=rhs,b/=rhs;
		return *this;
	}
	cp operator /(const db& rhs)const{
		cp ans=*this;
		ans/=rhs;
		return ans;
	}
	inline db real(){
		return a;
	}
};
const int maxn=(1<<21)+3;
const db pi=acos(-1.0);
struct fft{
	int n,k;
	int bitrev[maxn];
	cp omega[maxn];
	void init(int len){
		n=1,k=0;
		while(n<len)
			n<<=1,k++;
		omega[0]=1;
		for(int i=1;i<n;i++){
			omega[i]=cp(cos(2*pi*i/n),sin(2*pi*i/n));
			bitrev[i]=(bitrev[i>>1]>>1)|((i&1)<<(k-1));
		}
	}
	cp wn[maxn];
	void trans(cp* a,bool rev){
		for(int i=0;i<n;i++)
			if (bitrev[i]<i)
				swap(a[i],a[bitrev[i]]);
		for(int i=1,qwq=k-1;i<n;i<<=1,qwq--){
			for(int j=0;j<i;j++)
				wn[j]=omega[j<<qwq];
			for(int j=0;j<n;j+=(i<<1))
				for(int k=j;k<j+i;k++){
					cp t=wn[k-j]*a[k+i];
					a[k+i]=a[k]-t;
					a[k]=a[k]+t;
				}
		}
		if (rev){
			reverse(a+1,a+n);
			for(int i=0;i<n;i++)
				a[i]/=n;
		}
	}
}t;
cp tmp[maxn];
void inv(cp *f,cp *g,int n){ //[0,n)
	int now=1;
	db qwq=f[0].a*f[0].a+f[0].b*f[0].b;
	g[0]=f[0]*qwq;
	g[0].b=-g[0].b;
	for(int i=1;i<n*2;i++)
		g[i]=0;
	// fprintf(stderr,"g[%d]=%lld\n",0,g[0]);
	while(now<n){
		now*=2;
		//mod (x^now)
		t.init(now*2);
		for(int i=0;i<t.n;i++)
			tmp[i]=0;
		for(int i=0;i<now;i++)
			tmp[i]=f[i];
		t.trans(tmp,0);
		t.trans(g,0);
		for(int i=0;i<t.n;i++)
			g[i]*=cp(2.0)-tmp[i]*g[i];
		t.trans(g,1);
		for(int i=now;i<t.n;i++)
			g[i]=0;
	}
}
void ln(cp *f,cp *g,int n){
	inv(f,g,n);
	/*for(int i=0;i<n;i++)
		printf("%lld ",invf[i]);
	puts("");*/
	for(int i=0;i<n;i++)
		tmp[i]=f[i+1]*(i+1.0);
	t.init(n*2); //fw*invf
	for(int i=n;i<t.n;i++)
		tmp[i]=0;
	t.trans(g,0);
	t.trans(tmp,0);
	for(int i=0;i<t.n;i++)
		g[i]=g[i]*tmp[i];
	t.trans(g,1);
	for(int i=n-2;i>=0;i--)
		g[i+1]=g[i]/(i+1.0);
	g[0]=0;
}
void exp(cp *f,cp *g,int n){
	static cp lng[maxn];
	for(int i=0;i<2*n;i++)
		lng[i]=0;
	g[0]=1;
	for(int i=1;i<2*n;i++)
		g[i]=0;
	int now=1;
	while(now<n){
		now*=2;
		//mod x^now;
		ln(g,lng,now);
		// t.init(2*now);
		for(int i=0;i<now;i++)
			tmp[i]=f[i];
		for(int i=now;i<t.n;i++)
			tmp[i]=lng[i]=0;
		t.trans(tmp,0);
		t.trans(lng,0);
		t.trans(g,0);
		for(int i=0;i<t.n;i++)
			g[i]*=(tmp[i]+1.0-lng[i]);
		t.trans(g,1);
		for(int i=now;i<t.n;i++)
			g[i]=0;
	}
}
cp f[maxn],g[maxn];
int a[maxn];
bool app[maxn];
int ans[maxn];
int main(){
	init();
	// t.test();
	int n=readint(),m=readint();
	for(int i=1;i<=n;i++)
		a[i]=readint(),app[a[i]]=1;
	int k=1;
	while(k<=m)
		k<<=1;
	f[0]=1,f[1]=-1;
	ln(f,g,k);
	memset(f,0,sizeof(f));
	for(int i=1;i<=n;i++)
		for(int j=0,now=0;j<=k;j+=a[i],now++)
			f[j]-=g[now];
	exp(f,g,k);
	for(int i=1;i<=m;i++)
		if (!app[i] && (int)(g[i].real()+0.5))
			return puts("NO"),0;
	int cur=0;
	for(int i=1;i<=m;i++)
		if (((int)(g[i].real()+0.5))==1)
			ans[++cur]=i;
	puts("YES");
	printf("%d\n",cur);
	for(int i=1;i<=cur;i++)
		printf("%d ",ans[i]);
}


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXSIZE=30000020;
int bufpos;
char buf[MAXSIZE];
#define NEG 0
void init(){
	#ifdef LOCAL
		freopen("286E.txt","r",stdin);
	#endif
	buf[fread(buf,1,MAXSIZE,stdin)]='\0';
	bufpos=0;
}
#if NEG
int readint(){
	bool isneg;
	int val=0;
	for(;!isdigit(buf[bufpos]) && buf[bufpos]!='-';bufpos++);
	bufpos+=(isneg=buf[bufpos]=='-');
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return isneg?-val:val;
}
#else
int readint(){
	int val=0;
	for(;!isdigit(buf[bufpos]);bufpos++);
	for(;isdigit(buf[bufpos]);bufpos++)
		val=val*10+buf[bufpos]-'0';
	return val;
}
#endif
char readchar(){
	for(;isspace(buf[bufpos]);bufpos++);
	return buf[bufpos++];
}
int readstr(char* s){
	int cur=0;
	for(;isspace(buf[bufpos]);bufpos++);
	for(;!isspace(buf[bufpos]);bufpos++)
		s[cur++]=buf[bufpos];
	s[cur]='\0';
	return cur;
}
const int mod=998244353;
ll power(ll x,ll y){
	x%=mod;
	ll ans=1;
	while(y){
		if (y&1)
			ans=ans*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return ans;
}
const int maxn=(1<<21)+3;
struct fft{
	int n,k;
	int bitrev[maxn];
	ll omega[maxn];
	void init(int len){
		n=1,k=0;
		while(n<len)
			n<<=1,k++;
		omega[0]=1;
		ll t=power(3,(mod-1)/n);
		for(int i=1;i<n;i++){
			omega[i]=omega[i-1]*t%mod;
			bitrev[i]=(bitrev[i>>1]>>1)|((i&1)<<(k-1));
		}
	}
	ll wn[maxn];
	void trans(ll* a,bool rev){
		for(int i=0;i<n;i++)
			if (bitrev[i]<i)
				swap(a[i],a[bitrev[i]]);
		for(int i=1,qwq=k-1;i<n;i<<=1,qwq--){
			for(int j=0;j<i;j++)
				wn[j]=omega[j<<qwq];
			for(int j=0;j<n;j+=(i<<1))
				for(int k=j;k<j+i;k++){
					ll t=wn[k-j]*a[k+i];
					a[k+i]=(a[k]-t)%mod;
					a[k]=(a[k]+t)%mod;
				}
		}
		if (rev){
			reverse(a+1,a+n);
			ll inv=power(n,mod-2);
			for(int i=0;i<n;i++)
				a[i]=a[i]*inv%mod;
		}
	}
	void test(){
		static ll a[maxn],b[maxn];
		init(8);
		a[0]=a[1]=1;
		b[0]=b[2]=1,b[1]=2;
		trans(a,0);
		trans(b,0);
		for(int i=0;i<n;i++)
			a[i]=a[i]*b[i]%mod;
		trans(a,1);
		for(int i=0;i<n;i++)
			printf("a[%d]=%lld\n",i,a[i]);
	}
}t;
void inv(ll *f,ll *g,int n){ //[0,n)
	static ll tmp[maxn];
	int now=1;
	g[0]=power(f[0],mod-2);
	for(int i=1;i<n*2;i++)
		g[i]=0;
	// fprintf(stderr,"g[%d]=%lld\n",0,g[0]);
	while(now<n){
		now*=2;
		//mod (x^now)
		t.init(now*2);
		for(int i=0;i<t.n;i++)
			tmp[i]=0;
		for(int i=0;i<now;i++)
			tmp[i]=f[i];
		t.trans(tmp,0);
		t.trans(g,0);
		for(int i=0;i<t.n;i++)
			g[i]=(g[i]*((2-tmp[i]*g[i])%mod))%mod;
		t.trans(g,1);
		for(int i=now;i<t.n;i++)
			g[i]=0;
	}
}
void ln(ll *f,ll *g,int n){
	static ll invf[maxn],fw[maxn];
	inv(f,invf,n);
	/*for(int i=0;i<n;i++)
		printf("%lld ",invf[i]);
	puts("");*/
	for(int i=0;i<n;i++)
		fw[i]=f[i+1]*(i+1)%mod;
	t.init(n*2); //fw*invf
	for(int i=n;i<t.n;i++)
		fw[i]=0;
	t.trans(fw,0);
	t.trans(invf,0);
	for(int i=0;i<t.n;i++)
		fw[i]=fw[i]*invf[i]%mod;
	t.trans(fw,1);
	g[0]=0;
	for(int i=0;i<n-1;i++)
		g[i+1]=fw[i]*power(i+1,mod-2)%mod;
}
void exp(ll *f,ll *g,int n){
	static ll tmp[maxn],lng[maxn];
	for(int i=0;i<2*n;i++)
		lng[i]=0;
	g[0]=1;
	for(int i=1;i<2*n;i++)
		g[i]=0;
	int now=1;
	while(now<n){
		now*=2;
		//mod x^now;
		ln(g,lng,now);
		// t.init(2*now);
		for(int i=0;i<now;i++)
			tmp[i]=f[i];
		for(int i=now;i<t.n;i++)
			tmp[i]=lng[i]=0;
		t.trans(tmp,0);
		t.trans(lng,0);
		t.trans(g,0);
		for(int i=0;i<t.n;i++)
			g[i]=(g[i]*(1+tmp[i]-lng[i]))%mod;
		t.trans(g,1);
		for(int i=now;i<t.n;i++)
			g[i]=0;
	}
}
ll f[maxn],g[maxn],h[maxn];
int a[maxn];
bool app[maxn];
int ans[maxn];
int main(){
	init();
	int n=readint(),m=readint();
	for(int i=1;i<=n;i++)
		a[i]=readint(),app[a[i]]=1;
	int k=1;
	while(k<=m)
		k<<=1;
	f[0]=1,f[1]=mod-1;
	ln(f,g,k);
	for(int i=1;i<=n;i++)
		for(int j=0,now=0;j<=k;j+=a[i],now++)
			h[j]=(h[j]-g[now])%mod;
	exp(h,g,k);
	for(int i=1;i<=m;i++)
		if (!app[i] && g[i])
			return puts("NO"),0;
	int cur=0;
	for(int i=1;i<=m;i++)
		if ((g[i]+mod)%mod==1)
			ans[++cur]=i;
	puts("YES");
	printf("%d\n",cur);
	for(int i=1;i<=cur;i++)
		printf("%d ",ans[i]);
}


#include <cmath>
#include <complex>
#include <vector>
#include <iostream>
using namespace std;
typedef pair<int,int> pii;
typedef complex<double> base;

void fft(vector<base> &a, bool invert){
    int n = a.size();
    for(int i=1,j=0;i<n;i++){
        int bit = n >> 1;
        for (;j>=bit;bit>>=1)j -= bit;
        j += bit;
        if (i < j) swap(a[i], a[j]);
    }
    for(int len=2;len<=n;len<<=1){
        double ang = 2*acos(-1)/len*(invert?-1:1);
        base wlen(cos(ang),sin(ang));
        for(int i=0;i<n;i+=len){
            base w(1);
            for(int j=0;j<len/2;j++){
                base u = a[i+j], v = a[i+j+len/2]*w;
                a[i+j] = u+v;
                a[i+j+len/2] = u-v;
                w *= wlen;
            }
        }
    }
    if (invert) {
        for(int i=0;i<n;i++) a[i] /= n;
    }
}

void multiply(const vector<int> &a, const vector<int> &b, vector<int> &res){
    vector<base> fa(a.begin(), a.end()), fb(b.begin(),b.end());
    int n = 1;
    while(n < max(a.size(), b.size())) n <<= 1;
    n <<= 1;
    fa.resize(n); fb.resize(n);
    fft(fa,false);fft(fb,false);
    for(int i=0;i<n;i++) fa[i] *= fb[i];
    fft(fa,true);
    res.resize(n);
    for(int i=0;i<n;i++) res[i] = int(fa[i].real() + (fa[i].real() > 0 ? 0.5 : -0.5));
}

void simplify(vector<int> &a) {
	for(int i = 0; i < a.size(); i++) {
		if(a[i] != 0) a[i] = 1;
	}
}

void power(vector<int> a, int n, int maxDeg, vector<int> &res) {
	res.resize(1);
	res[0] = 1;
	while(n > 0) {
		if(n & 1) {
			multiply(res, a, res);
			simplify(res);
			res.resize(maxDeg);
		}
		multiply(a, a, a);
		simplify(a);
		a.resize(maxDeg);
		n >>= 1;
	}
}

const int MAXN = 1e6 + 50;
bool isBag[MAXN];

int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	vector<int> baglist(n), a(MAXN);
	for(int i = 0; i < n; i++) {
		scanf("%d", &baglist[i]);
		isBag[baglist[i]] = true;
		a[baglist[i]] = 1;
	}

	if(n == 1 && baglist[0] == 1) {
		cout << "NO" << endl;
		return 0;
	}

	multiply(a, a, a);
	simplify(a);

	vector<int> ans, b(MAXN);
	for(auto e : baglist) {
		if(a[e] == 0) {
			ans.push_back(e);
			b[e] = 1;
		}
	}
	b[0] = 1;

	vector<int> check;
	power(b, m, m+50, check);

	/*
	for(int i = 1; i < check.size(); i++) {
		if(check[i] != 0 && i <= m && !isBag[i]) {
			cout << "NO" << endl;
			return 0;
		}
	}
	*/

	cout << "YES" << endl;
	printf("%d\n", (int)ans.size());
	for(auto e : ans) printf("%d ", e);
}


#include <cmath>
#include <complex>
#include <vector>
#include <iostream>
using namespace std;
typedef pair<int,int> pii;
typedef complex<double> base;

void fft(vector<base> &a, bool invert){
    int n = a.size();
    for(int i=1,j=0;i<n;i++){
        int bit = n >> 1;
        for (;j>=bit;bit>>=1)j -= bit;
        j += bit;
        if (i < j) swap(a[i], a[j]);
    }
    for(int len=2;len<=n;len<<=1){
        double ang = 2*acos(-1)/len*(invert?-1:1);
        base wlen(cos(ang),sin(ang));
        for(int i=0;i<n;i+=len){
            base w(1);
            for(int j=0;j<len/2;j++){
                base u = a[i+j], v = a[i+j+len/2]*w;
                a[i+j] = u+v;
                a[i+j+len/2] = u-v;
                w *= wlen;
            }
        }
    }
    if (invert) {
        for(int i=0;i<n;i++) a[i] /= n;
    }
}

void multiply(const vector<int> &a, const vector<int> &b, vector<int> &res){
    vector<base> fa(a.begin(), a.end()), fb(b.begin(),b.end());
    int n = 1;
    while(n < max(a.size(), b.size())) n <<= 1;
    n <<= 1;
    fa.resize(n); fb.resize(n);
    fft(fa,false);fft(fb,false);
    for(int i=0;i<n;i++) fa[i] *= fb[i];
    fft(fa,true);
    res.resize(n);
    for(int i=0;i<n;i++) res[i] = int(fa[i].real() + (fa[i].real() > 0 ? 0.5 : -0.5));
}

void simplify(vector<int> &a) {
	for(int i = 0; i < a.size(); i++) {
		if(a[i] != 0) a[i] = 1;
	}
}

void power(vector<int> a, int n, int maxDeg, vector<int> &res) {
	res.resize(1);
	res[0] = 1;
	while(n > 0) {
		if(n & 1) {
			multiply(res, a, res);
			simplify(res);
			res.resize(maxDeg);
		}
		multiply(a, a, a);
		simplify(a);
		a.resize(maxDeg);
		n >>= 1;
	}
}

const int MAXN = 1e6 + 50;
bool isBag[MAXN];

int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	vector<int> baglist(n), a(MAXN);
	for(int i = 0; i < n; i++) {
		scanf("%d", &baglist[i]);
		isBag[baglist[i]] = true;
		a[baglist[i]] = 1;
	}

	multiply(a, a, a);
	simplify(a);

	vector<int> ans;
	for(int i = 0; i < a.size(); i++) {
		if(i > m) break;
		if(a[i] == 0 && isBag[i]) ans.push_back(i);
		else if(a[i] != 0 && !isBag[i]) {
			cout << "NO" << endl;
			return 0;
		}
	}

	cout << "YES" << endl;
	printf("%d\n", (int)ans.size());
	for(auto e : ans) printf("%d ", e);
}


#include <cmath>
#include <complex>
#include <vector>
#include <iostream>
using namespace std;
typedef pair<int,int> pii;
typedef complex<double> base;

void fft(vector<base> &a, bool invert){
    int n = a.size();
    for(int i=1,j=0;i<n;i++){
        int bit = n >> 1;
        for (;j>=bit;bit>>=1)j -= bit;
        j += bit;
        if (i < j) swap(a[i], a[j]);
    }
    for(int len=2;len<=n;len<<=1){
        double ang = 2*acos(-1)/len*(invert?-1:1);
        base wlen(cos(ang),sin(ang));
        for(int i=0;i<n;i+=len){
            base w(1);
            for(int j=0;j<len/2;j++){
                base u = a[i+j], v = a[i+j+len/2]*w;
                a[i+j] = u+v;
                a[i+j+len/2] = u-v;
                w *= wlen;
            }
        }
    }
    if (invert) {
        for(int i=0;i<n;i++) a[i] /= n;
    }
}

void multiply(const vector<int> &a, const vector<int> &b, vector<int> &res){
    vector<base> fa(a.begin(), a.end()), fb(b.begin(),b.end());
    int n = 1;
    while(n < max(a.size(), b.size())) n <<= 1;
    n <<= 1;
    fa.resize(n); fb.resize(n);
    fft(fa,false);fft(fb,false);
    for(int i=0;i<n;i++) fa[i] *= fb[i];
    fft(fa,true);
    res.resize(n);
    for(int i=0;i<n;i++) res[i] = int(fa[i].real() + (fa[i].real() > 0 ? 0.5 : -0.5));
}

void simplify(vector<int> &a) {
	for(int i = 0; i < a.size(); i++) {
		if(a[i] != 0) a[i] = 1;
	}
}

void power(vector<int> a, int n, int maxDeg, vector<int> &res) {
	res.resize(1);
	res[0] = 1;
	while(n > 0) {
		if(n & 1) {
			multiply(res, a, res);
			simplify(res);
			res.resize(maxDeg);
		}
		multiply(a, a, a);
		simplify(a);
		a.resize(maxDeg);
		n >>= 1;
	}
}

const int MAXN = 1e6 + 50;
bool isBag[MAXN];

int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	vector<int> baglist(n), a(MAXN);
	for(int i = 0; i < n; i++) {
		scanf("%d", &baglist[i]);
		isBag[baglist[i]] = true;
		a[baglist[i]] = 1;
	}

	if(n == 1 && baglist[0] == 1) {
		cout << "NO" << endl;
		return 0;
	}

	multiply(a, a, a);
	simplify(a);

	vector<int> ans, b(MAXN);
	for(auto e : baglist) {
		if(a[e] == 0) {
			ans.push_back(e);
			b[e] = 1;
		}
	}
	b[0] = 1;

	/*
	vector<int> check;
	power(b, m, m+50, check);

	for(int i = 1; i < check.size(); i++) {
		if(check[i] != 0 && i <= m && !isBag[i]) {
			cout << "NO" << endl;
			return 0;
		}
	}
	*/

	cout << "YES" << endl;
	printf("%d\n", (int)ans.size());
	for(auto e : ans) printf("%d ", e);
}


#include <cmath>
#include <complex>
#include <vector>

using namespace std;
typedef pair<int,int> pii;
typedef complex<double> base;

void fft(vector<base> &a, bool invert){
    int n = a.size();
    for(int i=1,j=0;i<n;i++){
        int bit = n >> 1;
        for (;j>=bit;bit>>=1)j -= bit;
        j += bit;
        if (i < j) swap(a[i], a[j]);
    }
    for(int len=2;len<=n;len<<=1){
        double ang = 2*acos(-1)/len*(invert?-1:1);
        base wlen(cos(ang),sin(ang));
        for(int i=0;i<n;i+=len){
            base w(1);
            for(int j=0;j<len/2;j++){
                base u = a[i+j], v = a[i+j+len/2]*w;
                a[i+j] = u+v;
                a[i+j+len/2] = u-v;
                w *= wlen;
            }
        }
    }
    if (invert) {
        for(int i=0;i<n;i++) a[i] /= n;
    }
}

void multiply(const vector<int> &a, const vector<int> &b, vector<int> &res){
    vector<base> fa(a.begin(), a.end()), fb(b.begin(),b.end());
    int n = 1;
    while(n < max(a.size(), b.size())) n <<= 1;
    n <<= 1;
    fa.resize(n); fb.resize(n);
    fft(fa,false);fft(fb,false);
    for(int i=0;i<n;i++) fa[i] *= fb[i];
    fft(fa,true);
    res.resize(n);
    for(int i=0;i<n;i++) res[i] = int(fa[i].real() + (fa[i].real() > 0 ? 0.5 : -0.5));
}

void simplify(vector<int> &a) {
	for(int i = 0; i < a.size(); i++) {
		if(a[i] != 0) a[i] = 1;
	}
}

void power(vector<int> a, int n, int maxDeg, vector<int> &res) {
	res.resize(1);
	res[0] = 1;
	while(n > 0) {
		if(n & 1) {
			multiply(res, a, res);
			simplify(res);
			res.resize(maxDeg);
		}
		multiply(a, a, a);
		simplify(a);
		a.resize(maxDeg);
		n >>= 1;
	}
}

const int MAXN = 1e6 + 50;
bool isBag[MAXN];

int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	vector<int> baglist(n), a(MAXN);
	for(int i = 0; i < n; i++) {
		scanf("%d", &baglist[i]);
		isBag[baglist[i]] = true;
		a[baglist[i]] = 1;
	}

	multiply(a, a, a);
	simplify(a);

	vector<int> ans;
	for(int i = 0; i < a.size(); i++) {
		if(i > m) break;
		if(a[i] == 0 && isBag[i]) ans.push_back(i);
		else if(a[i] != 0 && !isBag[i]) {
			printf("NO");
			return 0;
		}
	}

	printf("YES\n");
	printf("%d\n", (int)ans.size());
	for(auto e : ans) printf("%d ", e);
}


#include <cmath>
#include <complex>
#include <vector>
#include <iostream>
using namespace std;
typedef pair<int,int> pii;
typedef complex<double> base;

void fft(vector<base> &a, bool invert){
    int n = a.size();
    for(int i=1,j=0;i<n;i++){
        int bit = n >> 1;
        for (;j>=bit;bit>>=1)j -= bit;
        j += bit;
        if (i < j) swap(a[i], a[j]);
    }
    for(int len=2;len<=n;len<<=1){
        double ang = 2*acos(-1)/len*(invert?-1:1);
        base wlen(cos(ang),sin(ang));
        for(int i=0;i<n;i+=len){
            base w(1);
            for(int j=0;j<len/2;j++){
                base u = a[i+j], v = a[i+j+len/2]*w;
                a[i+j] = u+v;
                a[i+j+len/2] = u-v;
                w *= wlen;
            }
        }
    }
    if (invert) {
        for(int i=0;i<n;i++) a[i] /= n;
    }
}

void multiply(const vector<int> &a, const vector<int> &b, vector<int> &res){
    vector<base> fa(a.begin(), a.end()), fb(b.begin(),b.end());
    int n = 1;
    while(n < max(a.size(), b.size())) n <<= 1;
    n <<= 1;
    fa.resize(n); fb.resize(n);
    fft(fa,false);fft(fb,false);
    for(int i=0;i<n;i++) fa[i] *= fb[i];
    fft(fa,true);
    res.resize(n);
    for(int i=0;i<n;i++) res[i] = int(fa[i].real() + (fa[i].real() > 0 ? 0.5 : -0.5));
}

void simplify(vector<int> &a) {
	for(int i = 0; i < a.size(); i++) {
		if(a[i] != 0) a[i] = 1;
	}
}

void power(vector<int> a, int n, int maxDeg, vector<int> &res) {
	res.resize(1);
	res[0] = 1;
	while(n > 0) {
		if(n & 1) {
			multiply(res, a, res);
			simplify(res);
			res.resize(maxDeg);
		}
		multiply(a, a, a);
		simplify(a);
		a.resize(maxDeg);
		n >>= 1;
	}
}

const int MAXN = 1e6 + 50;
bool isBag[MAXN];

int main() {
	int n, m;
	scanf("%d%d", &n, &m);
	vector<int> baglist(n), a(MAXN);
	for(int i = 0; i < n; i++) {
		scanf("%d", &baglist[i]);
		isBag[baglist[i]] = true;
		a[baglist[i]] = 1;
	}

	multiply(a, a, a);
	simplify(a);

	vector<int> ans, b(MAXN);
	for(auto e : baglist) {
		if(a[e] == 0) {
			ans.push_back(e);
			b[e] = 1;
		}
	}
	b[0] = 1;

	vector<int> check;
	power(b, m, m+50, check);

	for(int i = 1; i < check.size(); i++) {
		if(check[i] != 0 && i <= m && !isBag[i]) {
			cout << "NO" << endl;
			return 0;
		}
	}

	cout << "YES" << endl;
	printf("%d\n", (int)ans.size());
	for(auto e : ans) printf("%d ", e);
}


#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")

#include "bits/stdc++.h"
#define mem(x) memset((x), 0, sizeof((x)))
#define il __attribute__((always_inline))
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#if __cplusplus > 201403L
#define r
#else
#define r register
#endif
#define ri r int
#define rl r ll
#define c const
namespace _c
{
c double pi = acos(-1.0); // PI
namespace min
{
c int i8 = -128;
c int i16 = -32768;
c int i = -2147483647 - 1;
c ll l = -9223372036854775807LL - 1;
} // namespace min
namespace max
{
c int i8 = 127;
c int i16 = 32767;
c int i = 2147483647;
c ll l = 9223372036854775807LL;
} // namespace max
} // namespace _c
namespace _f
{
template <typename T> // return gcd
inline c T gcd(T m, T n)
{
    while (n != 0)
    {
        T t = m % n;
        m = n;
        n = t;
    }
    return m;
}
template <typename T>
inline c T max(c T &a, c T &b)
{
    return a > b ? a : b;
}
template <typename T>
inline c T min(c T &a, c T &b)
{
    return a < b ? a : b;
}
template <typename T>
inline c T abs(c T &a)
{
    return a > 0 ? a : -a;
}
template <typename T>
inline T pow(T a, T b)
{
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
template <typename T>
inline T pow(T a, T b, c T &m)
{
    a %= m;
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return res % m;
}
} // namespace _f
namespace io
{
template <typename T>
inline void read(T &t)
{
    r T res = 0, neg = 1;
    char g = getchar();
    for (; !isdigit(g); g = getchar())
    {
        if (g == '-')
        {
            neg = -1;
        }
    }
    for (; isdigit(g); g = getchar())
    {
        res = res * 10 + g - '0';
    }
    t = res * neg;
}
#if __cplusplus >= 201103L
template <typename T, typename... Args>
void read(T &x, Args &... args)
{
    read(x);
    read(args...);
}
#endif
inline int in()
{
    ri T;
    read(T);
    return T;
}
inline ll in_ll()
{
    rl T;
    read(T);
    return T;
}
} // namespace io
#undef c
#undef r

typedef complex<double> cp;
const cp I(0, 1);
const double eps = 1e-5;
int n, m, p[2111111], S[2111111], L;
bool c[2111111];
cp a[2111111], b[2111111];
void fft(int n, double t, cp *a)
{
    int m, h, i, j, k;
    cp w, x;
    for (m = n, h; h = m / 2, m >= 2; t *= 2, m = h)
        for (i = 0; i < h; i++)
            for (w = exp(i * t * I), j = i; j < n; j += m)
                k = j + h, x = a[j] - a[k], a[j] += a[k], a[k] = w * x;
    i = 0;
    for (j = 1; j < n - 1; j++)
    {
        for (k = n / 2; k > (i ^= k); k /= 2)
            ;
        if (j < i)
            swap(a[i], a[j]);
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", p + i),
            a[p[i]] = 1, c[p[i]] = 1;
    int n2 = 1 << 21;
    fft(n2, 2 * _c::pi / n2, a);
    for (int i = 0; i < n2; i++)
        b[i] = a[i] * a[i];
    fft(n2, -2 * _c::pi / n2, b);
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) > 0.5 * n2 && !c[i])
        {
            puts("NO");
            return 0;
        }
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) < 0.5 * n2 && c[i])
            S[++L] = i;
    puts("YES");
    printf("%d\n", L);
    for (int i = 1; i <= L; i++)
        printf("%d%c", S[i], i == L ? '\n' : ' ');
    return 0;
}


#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")

#include "bits/stdc++.h"
#define mem(x) memset((x), 0, sizeof((x)))
#define il __attribute__((always_inline))
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#if __cplusplus > 201403L
#define r
#else
#define r register
#endif
#define ri r int
#define rl r ll
#define c const
namespace _c
{
c double pi = acos(-1.0); // PI
namespace min
{
c int i8 = -128;
c int i16 = -32768;
c int i = -2147483647 - 1;
c ll l = -9223372036854775807LL - 1;
} // namespace min
namespace max
{
c int i8 = 127;
c int i16 = 32767;
c int i = 2147483647;
c ll l = 9223372036854775807LL;
} // namespace max
} // namespace _c
namespace _f
{
template <typename T> // return gcd
inline c T gcd(T m, T n)
{
    while (n != 0)
    {
        T t = m % n;
        m = n;
        n = t;
    }
    return m;
}
template <typename T>
inline c T max(c T &a, c T &b)
{
    return a > b ? a : b;
}
template <typename T>
inline c T min(c T &a, c T &b)
{
    return a < b ? a : b;
}
template <typename T>
inline c T abs(c T &a)
{
    return a > 0 ? a : -a;
}
template <typename T>
inline T pow(T a, T b)
{
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
template <typename T>
inline T pow(T a, T b, c T &m)
{
    a %= m;
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return res % m;
}
} // namespace _f
namespace io
{
template <typename T>
inline void read(T &t)
{
    r T res = 0, neg = 1;
    char g = getchar();
    for (; !isdigit(g); g = getchar())
    {
        if (g == '-')
        {
            neg = -1;
        }
    }
    for (; isdigit(g); g = getchar())
    {
        res = res * 10 + g - '0';
    }
    t = res * neg;
}
#if __cplusplus >= 201103L
template <typename T, typename... Args>
void read(T &x, Args &... args)
{
    read(x);
    read(args...);
}
#endif
inline int in()
{
    ri T;
    read(T);
    return T;
}
inline ll in_ll()
{
    rl T;
    read(T);
    return T;
}
} // namespace io
#undef c
#undef r

typedef complex<double> cp;
const cp I(0, 1);
const double eps = 1e-5;
int n, m, p[2111111], S[2111111], L;
bool c[2111111];
cp a[2111111], b[2111111];
void fft(int n, double t, cp *a)
{
    int m, h, i, j, k;
    cp w, x;
    for (m = n, h; h = m / 2, m >= 2; t *= 2, m = h)
        for (i = 0; i < h; i++)
            for (w = exp(i * t * I), j = i; j < n; j += m)
                k = j + h, x = a[j] - a[k], a[j] += a[k], a[k] = w * x;
    i = 0;
    for (j = 1; j < n - 1; j++)
    {
        for (k = n / 2; k > (i ^= k); k /= 2)
            ;
        if (j < i)
            swap(a[i], a[j]);
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", p + i),
            a[p[i]] = 1, c[p[i]] = 1;
    int n2 = 1 << 21;
    fft(n2, 2 * _c::pi / n2, a);
    for (int i = 0; i < n2; i++)
        b[i] = a[i] * a[i];
    fft(n2, -2 * _c::pi / n2, b);
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) > 0.5 * n2 && !c[i])
        {
            puts("N0");
            return 0;
        }
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) < 0.5 * n2 && c[i])
            S[++L] = i;
    puts("YES");
    printf("%d\n", L);
    for (int i = 1; i <= L; i++)
        printf("%d%c", S[i], i == L ? '\n' : ' ');
    return 0;
}


#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")

#include "bits/stdc++.h"
#define mem(x) memset((x), 0, sizeof((x)))
#define il __attribute__((always_inline))
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#if __cplusplus > 201403L
#define r
#else
#define r register
#endif
#define ri r int
#define rl r ll
#define c const
namespace _c
{
c double pi = acos(-1.0); // PI
namespace min
{
c int i8 = -128;
c int i16 = -32768;
c int i = -2147483647 - 1;
c ll l = -9223372036854775807LL - 1;
} // namespace min
namespace max
{
c int i8 = 127;
c int i16 = 32767;
c int i = 2147483647;
c ll l = 9223372036854775807LL;
} // namespace max
} // namespace _c
namespace _f
{
template <typename T> // return gcd
inline c T gcd(T m, T n)
{
    while (n != 0)
    {
        T t = m % n;
        m = n;
        n = t;
    }
    return m;
}
template <typename T>
inline c T max(c T &a, c T &b)
{
    return a > b ? a : b;
}
template <typename T>
inline c T min(c T &a, c T &b)
{
    return a < b ? a : b;
}
template <typename T>
inline c T abs(c T &a)
{
    return a > 0 ? a : -a;
}
template <typename T>
inline T pow(T a, T b)
{
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
template <typename T>
inline T pow(T a, T b, c T &m)
{
    a %= m;
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return res % m;
}
} // namespace _f
namespace io
{
template <typename T>
inline void read(T &t)
{
    r T res = 0, neg = 1;
    char g = getchar();
    for (; !isdigit(g); g = getchar())
    {
        if (g == '-')
        {
            neg = -1;
        }
    }
    for (; isdigit(g); g = getchar())
    {
        res = res * 10 + g - '0';
    }
    t = res * neg;
}
#if __cplusplus >= 201103L
template <typename T, typename... Args>
void read(T &x, Args &... args)
{
    read(x);
    read(args...);
}
#endif
inline int in()
{
    ri T;
    read(T);
    return T;
}
inline ll in_ll()
{
    rl T;
    read(T);
    return T;
}
} // namespace io
#undef c
#undef r

typedef complex<double> cp;
const cp I(0, 1);
const double eps = 1e-5;
int n, m, p[2111111], S[2111111], L;
bool c[2111111];
cp a[2111111], b[2111111];
void fft(int n, double t, cp *a)
{
    int m, h, i, j, k;
    cp w, x;
    for (m = n, h; h = m / 2, m >= 2; t *= 2, m = h)
        for (i = 0; i < h; i++)
            for (w = exp(i * t * I), j = i; j < n; j += m)
                k = j + h, x = a[j] - a[k], a[j] += a[k], a[k] = w * x;
    i = 0;
    for (j = 1; j < n - 1; j++)
    {
        for (k = n / 2; k > (i ^= k); k /= 2)
            ;
        if (j < i)
            swap(a[i], a[j]);
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", p + i),
            a[p[i]] = 1, c[p[i]] = 1;
    int n2 = 1 << 21;
    fft(n2, 2 * _c::pi / n2, a);
    for (int i = 0; i < n2; i++)
        b[i] = a[i] * a[i];
    fft(n2, -2 * _c::pi / n2, b);
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) > 0.5 * n2 && !c[i])
        {
            puts("NO");
            return 0;
        }
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) < 0.5 * n2 && c[i])
            S[++L] = i;
    puts("YES");
    printf("%d\n", L);
    for (int i = 1; i <= L; i++)
        printf("%c%d", S[i], i == L ? '\n' : ' ');
    return 0;
}


#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")

#include "bits/stdc++.h"
#define mem(x) memset((x), 0, sizeof((x)))
#define il __attribute__((always_inline))
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#if __cplusplus > 201403L
#define r
#else
#define r register
#endif
#define ri r int
#define rl r ll
#define c const
namespace _c
{
c double pi = acos(-1.0); // PI
namespace min
{
c int i8 = -128;
c int i16 = -32768;
c int i = -2147483647 - 1;
c ll l = -9223372036854775807LL - 1;
} // namespace min
namespace max
{
c int i8 = 127;
c int i16 = 32767;
c int i = 2147483647;
c ll l = 9223372036854775807LL;
} // namespace max
} // namespace _c
namespace _f
{
template <typename T> // return gcd
inline c T gcd(T m, T n)
{
    while (n != 0)
    {
        T t = m % n;
        m = n;
        n = t;
    }
    return m;
}
template <typename T>
inline c T max(c T &a, c T &b)
{
    return a > b ? a : b;
}
template <typename T>
inline c T min(c T &a, c T &b)
{
    return a < b ? a : b;
}
template <typename T>
inline c T abs(c T &a)
{
    return a > 0 ? a : -a;
}
template <typename T>
inline T pow(T a, T b)
{
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
template <typename T>
inline T pow(T a, T b, c T &m)
{
    a %= m;
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return res % m;
}
} // namespace _f
namespace io
{
template <typename T>
inline void read(T &t)
{
    r T res = 0, neg = 1;
    char g = getchar();
    for (; !isdigit(g); g = getchar())
    {
        if (g == '-')
        {
            neg = -1;
        }
    }
    for (; isdigit(g); g = getchar())
    {
        res = res * 10 + g - '0';
    }
    t = res * neg;
}
#if __cplusplus >= 201103L
template <typename T, typename... Args>
void read(T &x, Args &... args)
{
    read(x);
    read(args...);
}
#endif
inline int in()
{
    ri T;
    read(T);
    return T;
}
inline ll in_ll()
{
    rl T;
    read(T);
    return T;
}
} // namespace io
#undef c
#undef r

typedef complex<double> cp;
const cp I(0, 1);
const double eps = 1e-5;
int n, m, p[2111111], S[2111111], L;
bool c[2111111];
cp a[2111111], b[2111111];
void fft(int n, double t, cp *a)
{
    int m, h, i, j, k;
    cp w, x;
    for (m = n, h; h = m / 2, m >= 2; t *= 2, m = h)
        for (i = 0; i < h; i++)
            for (w = exp(i * t * I), j = i; j < n; j += m)
                k = j + h, x = a[j] - a[k], a[j] += a[k], a[k] = w * x;
    i = 0;
    for (j = 1; j < n - 1; j++)
    {
        for (k = n / 2; k > (i ^= k); k /= 2)
            ;
        if (j < i)
            swap(a[i], a[j]);
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", p + i),
            a[p[i]] = 1, c[p[i]] = 1;
    int n2 = 1 << 21;
    fft(n2, 2 * _c::pi / n2, a);
    for (int i = 0; i < n2; i++)
        b[i] = a[i] * a[i];
    fft(n2, -2 * _c::pi / n2, b);
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) > 0.5 * n2 && !c[i])
        {
            puts("NO");
            return 0;
        }
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) < 0.5 * n2 && c[i])
            S[++L] = i;
    puts("YES");
    printf("%d\n", L);
    for (int i = 1; i <= L; i++)
        printf("%d%d", S[i], i == L ? '\n' : ' ');
    return 0;
}


#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")

#include "bits/stdc++.h"
#define mem(x) memset((x), 0, sizeof((x)))
#define il __attribute__((always_inline))
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#if __cplusplus > 201403L
#define r
#else
#define r register
#endif
#define ri r int
#define rl r ll
#define c const
namespace _c
{
c double pi = acos(-1.0); // PI
namespace min
{
c int i8 = -128;
c int i16 = -32768;
c int i = -2147483647 - 1;
c ll l = -9223372036854775807LL - 1;
} // namespace min
namespace max
{
c int i8 = 127;
c int i16 = 32767;
c int i = 2147483647;
c ll l = 9223372036854775807LL;
} // namespace max
} // namespace _c
namespace _f
{
template <typename T> // return gcd
inline c T gcd(T m, T n)
{
    while (n != 0)
    {
        T t = m % n;
        m = n;
        n = t;
    }
    return m;
}
template <typename T>
inline c T max(c T &a, c T &b)
{
    return a > b ? a : b;
}
template <typename T>
inline c T min(c T &a, c T &b)
{
    return a < b ? a : b;
}
template <typename T>
inline c T abs(c T &a)
{
    return a > 0 ? a : -a;
}
template <typename T>
inline T pow(T a, T b)
{
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
template <typename T>
inline T pow(T a, T b, c T &m)
{
    a %= m;
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return res % m;
}
} // namespace _f
namespace io
{
template <typename T>
inline void read(T &t)
{
    r T res = 0, neg = 1;
    char g = getchar();
    for (; !isdigit(g); g = getchar())
    {
        if (g == '-')
        {
            neg = -1;
        }
    }
    for (; isdigit(g); g = getchar())
    {
        res = res * 10 + g - '0';
    }
    t = res * neg;
}
#if __cplusplus >= 201103L
template <typename T, typename... Args>
void read(T &x, Args &... args)
{
    read(x);
    read(args...);
}
#endif
inline int in()
{
    ri T;
    read(T);
    return T;
}
inline ll in_ll()
{
    rl T;
    read(T);
    return T;
}
} // namespace io
#undef c
#undef r

typedef complex<ld> cp;
const cp I(0, 1);
const ld eps = 1e-5;
int n, m, p[2111111], S[2111111], L;
bool c[2111111];
cp a[2111111], b[2111111];
void fft(int n, ld t, cp *a)
{
    int m, h, i, j, k;
    cp w, x;
    for (m = n, h; h = m / 2, m >= 2; t *= 2, m = h)
        for (i = 0; i < h; i++)
            for (w = exp(i * t * I), j = i; j < n; j += m)
                k = j + h, x = a[j] - a[k], a[j] += a[k], a[k] = w * x;
    i = 0;
    for (j = 1; j < n - 1; j++)
    {
        for (k = n / 2; k > (i ^= k); k /= 2)
            ;
        if (j < i)
            swap(a[i], a[j]);
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", p + i),
            a[p[i]] = 1, c[p[i]] = 1;
    int n2 = 1 << 21;
    fft(n2, 2 * _c::pi / n2, a);
    for (int i = 0; i < n2; i++)
        b[i] = a[i] * a[i];
    fft(n2, -2 * _c::pi / n2, b);
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) > 0.5 * n2 && !c[i])
        {
            puts("NO");
            return 0;
        }
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) < 0.5 * n2 && c[i])
            S[++L] = i;
    puts("YES");
    printf("%d\n", L);
    for (int i = 1; i <= L; i++)
        printf("%d%c", S[i], i == L ? '\n' : ' ');
    return 0;
}


#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")

#include "bits/stdc++.h"
#define mem(x) memset((x), 0, sizeof((x)))
#define il __attribute__((always_inline))
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
#if __cplusplus > 201403L
#define r
#else
#define r register
#endif
#define ri r int
#define rl r ll
#define c const
namespace _c
{
c double pi = cos(-1.0); // PI
namespace min
{
c int i8 = -128;
c int i16 = -32768;
c int i = -2147483647 - 1;
c ll l = -9223372036854775807LL - 1;
} // namespace min
namespace max
{
c int i8 = 127;
c int i16 = 32767;
c int i = 2147483647;
c ll l = 9223372036854775807LL;
} // namespace max
} // namespace _c
namespace _f
{
template <typename T> // return gcd
inline c T gcd(T m, T n)
{
    while (n != 0)
    {
        T t = m % n;
        m = n;
        n = t;
    }
    return m;
}
template <typename T>
inline c T max(c T &a, c T &b)
{
    return a > b ? a : b;
}
template <typename T>
inline c T min(c T &a, c T &b)
{
    return a < b ? a : b;
}
template <typename T>
inline c T abs(c T &a)
{
    return a > 0 ? a : -a;
}
template <typename T>
inline T pow(T a, T b)
{
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
template <typename T>
inline T pow(T a, T b, c T &m)
{
    a %= m;
    T res = 1;
    while (b > 0)
    {
        if (b & 1)
        {
            res = res * a % m;
        }
        a = a * a % m;
        b >>= 1;
    }
    return res % m;
}
} // namespace _f
namespace io
{
template <typename T>
inline void read(T &t)
{
    r T res = 0, neg = 1;
    char g = getchar();
    for (; !isdigit(g); g = getchar())
    {
        if (g == '-')
        {
            neg = -1;
        }
    }
    for (; isdigit(g); g = getchar())
    {
        res = res * 10 + g - '0';
    }
    t = res * neg;
}
#if __cplusplus >= 201103L
template <typename T, typename... Args>
void read(T &x, Args &... args)
{
    read(x);
    read(args...);
}
#endif
inline int in()
{
    ri T;
    read(T);
    return T;
}
inline ll in_ll()
{
    rl T;
    read(T);
    return T;
}
} // namespace io
#undef c
#undef r

typedef complex<double> cp;
const cp I(0, 1);
const double eps = 1e-5;
int n, m, p[2111111], S[2111111], L;
bool c[2111111];
cp a[2111111], b[2111111];
void fft(int n, double t, cp *a)
{
    int m, h, i, j, k;
    cp w, x;
    for (m = n, h; h = m / 2, m >= 2; t *= 2, m = h)
        for (i = 0; i < h; i++)
            for (w = exp(i * t * I), j = i; j < n; j += m)
                k = j + h, x = a[j] - a[k], a[j] += a[k], a[k] = w * x;
    i = 0;
    for (j = 1; j < n - 1; j++)
    {
        for (k = n / 2; k > (i ^= k); k /= 2)
            ;
        if (j < i)
            swap(a[i], a[j]);
    }
}
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
        scanf("%d", p + i),
            a[p[i]] = 1, c[p[i]] = 1;
    int n2 = 1 << 21;
    fft(n2, 2 * _c::pi / n2, a);
    for (int i = 0; i < n2; i++)
        b[i] = a[i] * a[i];
    fft(n2, -2 * _c::pi / n2, b);
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) > 0.5 * n2 && !c[i])
        {
            puts("NO");
            return 0;
        }
    for (int i = 1; i <= m; i++)
        if (fabs(b[i].real()) < 0.5 * n2 && c[i])
            S[++L] = i;
    puts("YES");
    printf("%d\n", L);
    for (int i = 1; i <= L; i++)
        printf("%d%c", S[i], i == L ? '\n' : ' ');
    return 0;
}


#include<bits/stdc++.h>
using namespace std;

typedef double lf;
typedef complex<lf> base;

const lf PI = 3.14159265358979;

void FFT(vector<base> &a, bool inv) {
    int n = a.size();
    for(int i = 1, j = 0; i < n; i++) {
        int bit = n>>1;
        for(; j >= bit; bit>>=1) j -= bit;
        j += bit;
        if(i < j) swap(a[i], a[j]);
    }
    for(int len = 2; len <= n; len <<= 1) {
        lf ang = 2*PI / len * (inv? 1 : -1);
        base wlen(cos(ang), sin(ang));
        for(int i = 0; i < n; i += len) {
            base w(1);
            for(int j = 0; j < len / 2; j++) {
                base u = a[i + j], v = a[i + j + len / 2] * w;
                a[i + j] = u + v;
                a[i + j + len / 2] = u - v;
                w *= wlen;
            }
        }
    }
    if(inv) for(int i = 0; i < n; i++) a[i] /= n;
}

void Multiply(vector<int> &a, vector<int> &b, vector<int> &res) {
    vector<base> fa(a.begin(), a.end()), fb(b.begin(), b.end());
    int n = 1;
    while(n < max(a.size(), b.size())) n <<= 1;
    n <<= 1;
    fa.resize(n); FFT(fa, false);
    fb.resize(n); FFT(fb, false);
    for(int i = 0; i < n; i++) fa[i] *= fb[i];
    FFT(fa, true);
    res.resize(n);
    for(int i = 0; i < n; i++) res[i] = (int)(fa[i].real() + (fa[i].real() > 0? 0.5 : -0.5));
}

int N, M;
vector<int> arr, res, ans;

int main() {
    scanf("%d %d", &N, &M);
    arr = vector<int>(M + 1, 0);
    for(int i = 0; i < N; i++) {
        int t; scanf("%d", &t);
        arr[t] = 1;
    }

    Multiply(arr, arr, res);

    for(int i = 0; i <= M; i++) {
        if(!arr[i] && res[i]) {
            printf("NO");
            return 0;
        }
        if(arr[i] && !res[i]) ans.push_back(i);
    }

    printf("YES\n%d\n", ans.size());
    for(int i = 0; i < ans.size(); i++) {
        printf("%d ", ans[i]);
    }
}


//��CF 286E
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL;
typedef double DB;
const int N = 1<<22;
const DB pi = 3.14159265358979;
struct complex{
	DB x,y;
	complex(DB xx=0.0,DB yy=0.0){
		x=xx,y=yy;
	}
}C[N];
complex operator+(complex a,complex b){
	return complex(a.x+b.x,a.y+b.y);
}
complex operator-(complex a,complex b){
	return complex(a.x-b.x,a.y-b.y);
}
complex operator*(complex a,complex b){
	return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
complex operator/(complex a,DB d){
	return complex(a.x/d,a.y/d);
}
void FFT(int n,int fl){
	int i,j,k,l;
	complex u,v,w,cur;
	i=n>>1;
	for(j=1;j<n;j=j+1){
		if(i<j)
			swap(C[i],C[j]);
		for(k=n>>1;i&k;k>>=1)
			i^=k;
		i^=k;
	}
	for(l=2;l<=n;l<<=1){
		w=complex(cos(2.0*pi/l),sin(2.0*pi*fl/l));
		for(i=0;i<n;i=i+l){
			cur=complex(1.0,0.0);
			for(j=i;j<i+(l>>1);j=j+1){
				u=C[j],v=C[j+(l>>1)]*cur;
				C[j]=u+v,C[j+(l>>1)]=u-v;
				cur=cur*w;
			}
		}
	}
}
int n,m,a[N],f[N];
LL b[N];
void solve(){
	int i,l;
	for(l=1;l<m+m;l<<=1);
	for(i=0;i<l;i=i+1)
		C[i]=complex(b[i],0.0);
	FFT(l,1);
	for(i=0;i<l;i=i+1)
		C[i]=C[i]*C[i];
	FFT(l,-1);
	for(i=0;i<m;i=i+1){
		b[i]=(LL)(C[i].x+0.5)/l;
		if(i){
			if(b[i]!=2)
				f[i]=0;
			else
				b[i]>>=1;
		}
	}
}
int main()
{
	int i,x,s=0;
	scanf("%d%d",&n,&m);
	m++;
	b[0]=1;
	for(i=1;i<=n;i=i+1){
		scanf("%d",&x);
		a[x]=1;
		b[x]=1;
		f[x]=1;
	}
	//for(i=1;i<=20;i=i+1)
		solve();
	for(i=1;i<m;i=i+1){
		if(!a[i]&&b[i]){
			cout<<"NO\n";
			return 0;
		}
		s+=f[i];
	}
	printf("YES\n%d\n",s);
	for(i=1;i<=m;i=i+1)
		if(f[i])
			printf("%d ",i);
	return 0;
}


//��UOJ34
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL;
typedef double DB;
const int N = 1<<19;
const DB pi = 3.1415926535;
struct complex{
	DB x,y;
	complex(DB xx=0.0,DB yy=0.0){
		x=xx,y=yy;
	}
}A[N],B[N];
complex operator+(complex a,complex b){
	return complex(a.x+b.x,a.y+b.y);
}
complex operator-(complex a,complex b){
	return complex(a.x-b.x,a.y-b.y);
}
complex operator*(complex a,complex b){
	return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
complex operator/(complex a,DB d){
	return complex(a.x/d,a.y/d);
}
void FFT(complex C[],int n,int fl){
	int i,j,k,l;
	complex u,v,w,cur;
	i=n>>1;
	for(j=1;j<n;j=j+1){
		if(i<j)
			swap(C[i],C[j]);
		for(k=n>>1;i&k;k>>=1)
			i^=k;
		i^=k;
	}
	for(l=2;l<=n;l<<=1){
		w=complex(cos(2.0*pi/l),sin(2.0*pi*fl/l));
		for(i=0;i<n;i=i+l){
			cur=complex(1.0,0.0);
			for(j=i;j<i+(l>>1);j=j+1){
				u=C[j],v=C[j+(l>>1)]*cur;
				C[j]=u+v,C[j+(l>>1)]=u-v;
				cur=cur*w;
			}
		}
	}
}
int n,a[N];
int m,b[N];
void solve(){
	int i,l;
	for(l=1;l<n+m;l<<=1);
	for(i=0;i<n;i=i+1)
		A[i]=complex(a[i],0.0);
	for(i=0;i<m;i=i+1)
		B[i]=complex(b[i],0.0);
	FFT(A,l,1);
	FFT(B,l,1);
	for(i=0;i<l;i=i+1)
		A[i]=A[i]*B[i];
	FFT(A,l,-1);
	for(i=0;i<l;i=i+1)
		A[i]=A[i]/l;
}
int main()
{
	int i;
	scanf("%d%d",&n,&m);
	n++,m++;
	for(i=0;i<n;i=i+1)
		scanf("%d",a+i);
	for(i=0;i<m;i=i+1)
		scanf("%d",b+i);
	solve();
	for(i=0;i<n+m-1;i=i+1)
		cout<<(int)(A[i].x+0.5)<<' ';
	return 0;
}


//��CF 286E
#include<iostream>
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL;
typedef double DB;
const int N = 1<<22;
const DB pi = 3.14159265358979;
struct complex{
	DB x,y;
	complex(DB xx=0.0,DB yy=0.0){
		x=xx,y=yy;
	}
}C[N];
complex operator+(complex a,complex b){
	return complex(a.x+b.x,a.y+b.y);
}
complex operator-(complex a,complex b){
	return complex(a.x-b.x,a.y-b.y);
}
complex operator*(complex a,complex b){
	return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
complex operator/(complex a,DB d){
	return complex(a.x/d,a.y/d);
}
void FFT(int n,int fl){
	int i,j,k,l;
	complex u,v,w,cur;
	i=n>>1;
	for(j=1;j<n;j=j+1){
		if(i<j)
			swap(C[i],C[j]);
		for(k=n>>1;i&k;k>>=1)
			i^=k;
		i^=k;
	}
	for(l=2;l<=n;l<<=1){
		w=complex(cos(2.0*pi/l),sin(2.0*pi*fl/l));
		for(i=0;i<n;i=i+l){
			cur=complex(1.0,0.0);
			for(j=i;j<i+(l>>1);j=j+1){
				u=C[j],v=C[j+(l>>1)]*cur;
				C[j]=u+v,C[j+(l>>1)]=u-v;
				cur=cur*w;
			}
		}
	}
}
int n,m,a[N],f[N];
LL b[N];
void solve(){
	int i,l;
	for(l=1;l<m+m;l<<=1);
	for(i=0;i<l;i=i+1)
		C[i]=complex(b[i],0.0);
	FFT(l,1);
	for(i=0;i<l;i=i+1)
		C[i]=C[i]*C[i];
	FFT(l,-1);
	for(i=0;i<m;i=i+1){
		b[i]=(LL)(C[i].x+0.5)/l;
		if(i){
			if(b[i]!=2)
				f[i]=0;
			else
				b[i]>>=1;
		}
	}
}
int main()
{
	int i,x,s=0;
	scanf("%d%d",&n,&m);
	m++;
	b[0]=1;
	for(i=1;i<=n;i=i+1){
		scanf("%d",&x);
		a[x]=1;
		b[x]=1;
		f[x]=1;
	}
	for(i=1;i<=20;i=i+1)
		solve();
	for(i=1;i<m;i=i+1){
		if(!a[i]&&b[i]){
			cout<<"NO\n";
			return 0;
		}
		s+=f[i];
	}
	printf("YES\n%d\n",s);
	for(i=1;i<=m;i=i+1)
		if(f[i])
			printf("%d ",i);
	return 0;
}