题目描述
给定一个n次多项式F(x),和一个m次多项式G(x)。
请求出F(x)和G(x)的卷积。
输入输出格式
输入格式:
第一行2个正整数n,m。
接下来一行n+1个数字,从低到高表示F(x)的系数。
接下来一行m+1个数字,从低到高表示G(x))的系数。
输出格式:
一行n+m+1个数字,从低到高表示F(x)∗G(x)的系数。
#include<bits/stdc++.h> using namespace std; const int MAXN=3000100; const double Pi=acos(-1.0); int sum,l,n,m,c[MAXN]; struct Node{ double x,y; Node (double x1=0,double y1=0){x=x1,y=y1;} }a[MAXN],b[MAXN]; Node operator * (Node x,Node y){ return Node(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x); } Node operator + (Node x,Node y){ return Node(x.x+y.x,x.y+y.y); } Node operator - (Node x,Node y){ return Node(x.x-y.x,x.y-y.y); } void fft(Node *x,int tf){ for (int i=0;i<sum;i++) if (i<c[i]) swap(x[i],x[c[i]]); for (int i=1;i<sum;i<<=1){ Node T(cos(Pi/i),tf*sin(Pi/i)); for (int k=0;k<sum;k+=(i<<1)){ Node t(1,0); for (int j=0;j<i;j++,t=t*T){ Node xx=x[k+j]; Node yy=t*x[k+i+j]; x[k+j]=xx+yy; x[k+i+j]=xx-yy; } } } } int main(){ scanf("%d%d",&n,&m),sum=1; for (int i=0;i<=n;i++) scanf("%lf",&a[i].x); for (int i=0;i<=m;i++) scanf("%lf",&b[i].x); while (sum<=n+m) sum<<=1,l++; for (int i=0;i<sum;i++) c[i]=(c[i>>1]>>1)|((i&1)<<(l-1)); fft(a,1),fft(b,1); for (int i=0;i<=sum;i++) a[i]=a[i]*b[i]; fft(a,-1); for (int i=0;i<=n+m;i++) printf("%d ",(int)(a[i].x/sum+0.5)); return 0; }