博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Swerc2014 C]Golf Bot
阅读量:6656 次
发布时间:2019-06-25

本文共 1442 字,大约阅读时间需要 4 分钟。

题意:给你N个数字,每次利用这N个数字中最多两个数字进行加法运算,来得到目标中的M个数字。

Solution:

我们先来看看多项式乘法:\(A(x)=\sum_{i=0}^{n-1}a_ix^i\)\(B(x)=\sum_{i=0}^{n-1}b_ix^i\)\(C(x)=A(x)B(x)\)

\[ c_k=\sum_{i+j=k,0\le i,j\le n}a_ib_jx^k \]
有没有发现什么?我们可以将a复制一份为b,对于x,如果x在a里出现了,则令\(a_x=b_x=1\),特别的,令\(a_0=b_0=1\)

然后再将a,b两个多项式相乘,则对于一个数x,若\(c_x\)有值,则x可以被两个数组成,否则不行

Code:

#include
#define ll long long#define Pi acos(-1.0)using namespace std;const int N=200001*4;int n,m,ans,len=1,tim,rtt[N],c[N];struct cp{double x,y;}aa[N],bb[N];cp operator + (cp a,cp b){return (cp){a.x+b.x,a.y+b.y};}cp operator - (cp a,cp b){return (cp){a.x-b.x,a.y-b.y};}cp operator * (cp a,cp b){return (cp){a.x*b.x-a.y*b.y,a.y*b.x+a.x*b.y};}void FFT(cp *a,int flag){ for(int i=0;i
>1);u++,w=w*wn){ cp x=a[u],y=w*a[u+(l>>1)]; a[u]=x+y,a[u+(l>>1)]=x-y; } } }}int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();} while(isdigit(ch)){x=x*10+ch-48;ch=getchar();} return x*f;}int main(){ int maxx=0; n=read();aa[0].x=bb[0].x=1; for(int i=1;i<=n;i++){ int x=read(); aa[x].x=1,bb[x].x=1; maxx=max(maxx,x); } m=read();++maxx; for(int i=1;i<=m;i++) c[i]=read(); while(len<=(maxx<<1)) len<<=1,++tim; for(int i=0;i
>1]>>1)|((i&1)<<(tim-1)); FFT(aa,1);FFT(bb,1); for(int i=0;i

转载于:https://www.cnblogs.com/NLDQY/p/10738701.html

你可能感兴趣的文章
ios判断是否有中文
查看>>
Swift入门篇-字符串和字符
查看>>
【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限
查看>>
那些你觉得堪称神兵利器的 Chrome 插件
查看>>
程序员心得
查看>>
深入浅出KnockoutJS
查看>>
浅谈Android样式开发之View Animation (视图动画)
查看>>
JavaScript eval()函数
查看>>
两点计算角度
查看>>
PN-Net: Conjoined Triple Deep Network for Learning Local Image Descriptors-论文解读
查看>>
【leetcode】38. Count and Say
查看>>
自己制作redis 和mongo 镜像
查看>>
正则表达式
查看>>
java Annotation注解
查看>>
CAPI学习心得
查看>>
数据结构与算法刷题
查看>>
MFC界面的完善
查看>>
【洛谷 P1651】 塔 (差值DP)
查看>>
考虑碰撞的二能级原子和电磁场的相互作用
查看>>
从乔布斯在斯坦福大学毕业典礼上的演讲感触
查看>>