• Codeforces 286E


      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
    ");
    100     else
    101     {
    102         printf("YES
    ");
    103         for (int i=0; i<=m; ++i)
    104             if (vis[i] && a[i].real<eps)
    105                 ans[++ans[0]]=i;
    106         printf("%d
    ", 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 }
    View Code
  • 相关阅读:
    路由懒加载的实现
    vue中的tab栏切换内容变换
    H5页面的高度宽度100%
    vue中的路由的跳转的参数
    xxxx-xx-xx的时间的加减
    sql server 2008 R2 备份还原到sql 2012
    eval方法将字符串转换成json对象
    CSS3 圆角(border-radius)
    [Easyui
    JavaScript slice() 方法
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/5058144.html
Copyright © 2020-2023  润新知