首页 > 其他 > 详细

CF286E Ladies' Shop FFT + 卷积优化背包(神题)

时间:2019-07-12 09:18:16      阅读:119      评论:0      收藏:0      [点我收藏+]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!