Code:
#include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define maxn 4000000 #define ll long long using namespace std; const double pi=acos(-1.0); struct cpx { double x,y; cpx(double a=0,double b=0) {x=a,y=b; } cpx operator+(const cpx b) { return cpx(x+b.x,y+b.y); } cpx operator-(const cpx b) { return cpx(x-b.x,y-b.y); } cpx operator*(const cpx b) { return cpx(x*b.x-y*b.y,x*b.y+y*b.x); } }A[maxn]; void FFT(cpx *a,int n,int flag) { for(int i=0,k=0;i<n;++i) { if(i>k) swap(a[i],a[k]); for(int j=n>>1;(k^=j)<j;j>>=1); } for(int mid=1;mid<n;mid<<=1) { cpx wn(cos(pi/mid), flag*sin(pi/mid)),x,y; for(int i=0;i<n;i+=(mid<<1)) { cpx w(1,0); for(int j=0;j<mid;++j) { x=a[i+j],y=w*a[i+j+mid]; a[i+j]=x+y,a[i+j+mid]=x-y; w=w*wn; } } } if(flag==-1) for(int i=0;i<n;++i) a[i].x/=(double)n; } int ans[maxn],arr[maxn],bu[maxn]; int main() { // setIO("input"); int n,m,len; scanf("%d%d",&n,&m); for(int i=1;i<=n;++i) scanf("%d",&arr[i]); for(int i=1;i<=n;++i) bu[arr[i]]++,ans[arr[i]]++; for(int i=1;i<=m;++i) if(bu[i]) A[i].x=1; for(len=1;len<=(m<<1);len<<=1); FFT(A,len,1); for(int i=0;i<len;++i) A[i]=A[i]*A[i]; FFT(A,len,-1); for(int i=1;i<=m;++i) { if((ll)(A[i].x+0.5)>=1) { if(!bu[i]) { printf("NO\n"); return 0; } ans[i]=0; } } printf("YES\n"); int sum=0; for(int i=1;i<=m;++i) if(ans[i]) ++sum; printf("%d\n",sum); for(int i=1;i<=m;++i) if(ans[i]) printf("%d ",i); return 0; }
CF286E Ladies' Shop FFT + 卷积优化背包(神题)
原文:https://www.cnblogs.com/guangheli/p/11173947.html