标签:
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <algorithm> 5 #include <cstdlib> 6 #include <ctime> 7 #include <set> 8 #include <map> 9 using namespace std; 10 11 const int maxn=int(1e6)+100; 12 const double eps=0.5; 13 const double PI=acos(-1); 14 15 struct Complex 16 { 17 double real, imag; 18 19 Complex(double _x=0, double _y=0):real(_x), imag(_y) {} 20 21 Complex operator + (Complex b) 22 { 23 return Complex(real+b.real, imag+b.imag); 24 } 25 26 Complex operator - (Complex b) 27 { 28 return Complex(real-b.real, imag-b.imag); 29 } 30 31 Complex operator * (Complex b) 32 { 33 return Complex(real*b.real-imag*b.imag, real*b.imag+b.real*imag); 34 } 35 }; 36 37 int n, m; 38 int lg, wide; 39 bool vis[maxn]; 40 int ans[maxn], rev[maxn*8]; 41 Complex a[maxn*8]; 42 43 void init() 44 { 45 scanf("%d%d", &n, &m); 46 for (int i=1; i<=n; ++i) 47 { 48 int num; 49 scanf("%d", &num); 50 vis[num]=true; 51 a[num].real=1; 52 } 53 } 54 void init_order() 55 { 56 for (int i=0; i<wide; ++i) 57 for (int j=0; j<lg; ++j) 58 rev[i]=(rev[i]<<1) | (i>>j & 1); 59 } 60 void FFT(int type) 61 { 62 for (int i=0; i<wide; ++i) 63 if (rev[i]>i) swap(a[i], a[rev[i]]); 64 65 for (int i=2; i<=wide; i<<=1) 66 for (int j=0; j<wide; j+=i) 67 { 68 Complex w(cos(PI*2/i), sin(PI*2/i*(-type))); 69 Complex wn(1, 0); 70 for (int k=0; k<i>>1; ++k, wn=wn*w) 71 { 72 Complex tmp=a[j+k]; 73 a[j+k]=tmp+wn*a[j+k+(i>>1)]; 74 a[j+k+(i>>1)]=tmp-wn*a[j+k+(i>>1)]; 75 } 76 } 77 } 78 void solve() 79 { 80 lg=0; 81 while (1<<lg<m*2) ++lg; 82 wide=1<<lg; 83 init_order(); 84 FFT(1); 85 for (int i=0; i<wide; ++i) a[i]=a[i]*a[i]; 86 FFT(-1); 87 for (int i=0; i<wide; ++i) a[i].real/=wide; 88 /* 89 for (int i=0; i<wide; ++i) 90 printf("%d ", int(a[i].real+0.5)); 91 */ 92 bool flag=true; 93 for (int i=0; i<=m; ++i) 94 if (a[i].real>eps && !vis[i]) 95 { 96 flag=false; 97 break; 98 } 99 if (!flag) printf("NO\n"); 100 else 101 { 102 printf("YES\n"); 103 for (int i=0; i<=m; ++i) 104 if (vis[i] && a[i].real<eps) 105 ans[++ans[0]]=i; 106 printf("%d\n", ans[0]); 107 for (int i=1; i<=ans[0]; ++i) 108 printf("%d ", ans[i]); 109 } 110 } 111 int main() 112 { 113 freopen("input.txt", "r", stdin); 114 freopen("output.txt", "w", stdout); 115 init(); 116 solve(); 117 return 0; 118 }
标签:
原文地址:http://www.cnblogs.com/GerynOhenz/p/5058144.html