提前声明:在下用的是banner,外置一些奇怪的压行
像这样子:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int MAXN=1e7+10; const double pi=acos(-1.0); struct complex{ double a,b; complex (double aa=0,double bb=0){a=aa;b=bb;} }A[MAXN],B[MAXN]; int id[MAXN],limit=1,l=0; complex operator + (complex x,complex y){return complex(x.a+y.a , x.b+y.b);} complex operator - (complex x,complex y){return complex(x.a-y.a , x.b-y.b);} complex operator * (complex x,complex y){return complex(x.a*y.a-x.b*y.b , x.b*y.a+x.a*y.b);} int n,m; void fast_fast_tle(complex *T,int flag){ for(int i=0;i<limit;i++) if(i<id[i])swap(T[i],T[id[i]]); for(int mid=1;mid<limit;mid<<=1){ complex W(cos(pi/mid),flag*sin(pi/mid)); for(int block=mid<<1,p=0;p<limit;p+=block){ complex w(1,0); for(int k=0;k<mid;k++,w=w*W){ complex pos1=T[p+k],pos2=w*T[p+mid+k]; T[p+k]=pos1+pos2; T[p+mid+k]=pos1-pos2; } } } } int main(){ scanf("%d%d",&n,&m); for(int i=0;i<=n;i++)scanf("%lf",&A[i].a); for(int i=0;i<=m;i++)scanf("%lf",&B[i].a); while(limit<=n+m)limit<<=1,l++; for(int i=0;i<limit;i++)id[i]=(id[i>>1]>>1)|((i&1)<<(l-1)); fast_fast_tle(A,1); fast_fast_tle(B,1); for(int i=0;i<=limit;i++)A[i]=A[i]*B[i]; fast_fast_tle(A,-1); for(int i=0;i<=n+m;i++) printf("%d ",(int)(A[i].a/limit+0.5)); }
吐槽:这代码和我日常题解不是一个水平的呀