UOJ #34
#34. 多项式乘法
这是一道模板题。
给你两个多项式,请输出乘起来后的多项式。
输入格式
第一行两个整数 nn 和 mm,分别表示两个多项式的次数。
第二行 n+1n+1 个整数,表示第一个多项式的 00 到 nn 次项系数。
第三行 m+1m+1 个整数,表示第二个多项式的 00 到 mm 次项系数。
输出格式
一行 n+m+1n+m+1 个整数,表示乘起来后的多项式的 00 到 n+mn+m 次项系数。
样例一
input
1 2 1 2 1 2 1
output
1 4 5 2
explanation
(1+2x)⋅(1+2x+x2)=1+4x+5x2+2x3(1+2x)⋅(1+2x+x2)=1+4x+5x2+2x3。
限制与约定
0≤n,m≤1050≤n,m≤105,保证输入中的系数大于等于 00 且小于等于 99。
时间限制:1s1s
空间限制:256MB256MB
下载
没啥好说,直接上代码
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<complex> #define N 262144+6 #define pi acos(-1) using namespace std; int read() { int x=0,f=1;char s=getchar(); while(s>'9' || s<'0'){if(s=='-')f=-1;s=getchar();} while(s<='9' && s>='0'){x=x*10+s-'0';s=getchar();} return x*f; } typedef complex<double> E; E a[N],b[N]; int re[N],n,m,L=0; void fft(E *a,int f) { for(int i=0;i<n;i++)if(i<re[i])swap(a[i],a[re[i]]); for(int i=1;i<n;i<<=1) { E wn(cos(pi/i),f*sin(pi/i)); for(int p=i<<1,j=0;j<n;j+=p) { E w(1,0); for(int k=0;k<i;k++,w*=wn) { E x=a[j+k],y=w*a[j+k+i]; a[j+k]=x+y;a[j+k+i]=x-y; } } } if(f==-1)for(int i=0;i<n;i++)a[i]/=n; } int main() { n=read();m=read(); for(int i=0,x;i<=n;i++)x=read(),a[i]=x; for(int i=0,x;i<=m;i++)x=read(),b[i]=x; m=m+n;for(n=1;n<=m;n<<=1)L++;L--; for(int i=0;i<n;i++)re[i]=(re[i>>1]>>1)|((i&1)<<L); fft(a,1);fft(b,1); for(int i=0;i<=n;i++)a[i]=a[i]*b[i]; fft(a,-1); for(int i=0;i<=m;i++)printf("%d ",(int)(a[i].real()+0.5)); return 0; }