首页 > 代码库 > [UOJ 0034] 多项式乘法
[UOJ 0034] 多项式乘法
#34. 多项式乘法
统计
这是一道模板题。
给你两个多项式,请输出乘起来后的多项式。
输入格式
第一行两个整数 nn 和 mm,分别表示两个多项式的次数。
第二行 n+1n+1 个整数,分别表示第一个多项式的 00 到 nn 次项前的系数。
第三行 m+1m+1 个整数,分别表示第一个多项式的 00 到 mm 次项前的系数。
输出格式
一行 n+m+1n+m+1 个整数,分别表示乘起来后的多项式的 00 到 n+mn+m 次项前的系数。
样例一
input
1 21 21 2 1output
1 4 5 2explanation
(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
空间限制:256MB
题解
FFT&NTT的模板题, 应该不用多说啥了吧OwO
FFT的讲解Rush了一晚上也没Rush出来OwO先放一波代码水一篇博(逃)
参考代码
GitHub
1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <iostream> 6 #include <algorithm> 7 8 const int MAXN=270000; 9 const int DFT=1;10 const int IDFT=-1;11 const double PI=acos(-1);12 13 struct Complex{14 double real;15 double imag;16 Complex(double r=0,double i=0){17 this->real=r;18 this->imag=i;19 }20 };21 Complex operator+(Complex a,Complex b){22 return Complex(a.real+b.real,a.imag+b.imag);23 }24 Complex operator-(Complex a,Complex b){25 return Complex(a.real-b.real,a.imag-b.imag);26 }27 Complex operator*(Complex a,Complex b){28 return Complex(a.real*b.real-a.imag*b.imag,a.real*b.imag+a.imag*b.real);29 }30 31 Complex a[MAXN],b[MAXN],c[MAXN];32 33 int n; //Length of a34 int m; //Length of b35 int bln=1; //Binary Length36 int bct; //Bit Count37 int len; //Length Sum38 int rev[MAXN]; //Binary Reverse Sort39 40 void Initialize();41 void FFT(Complex*,int,int);42 43 int main(){44 Initialize();45 FFT(a,bln,DFT);46 FFT(b,bln,DFT);47 for(int i=0;i<=bln;i++){48 c[i]=a[i]*b[i];49 }50 FFT(c,bln,IDFT);51 for(int i=0;i<=len;i++){52 printf("%d ",int(c[i].real/bln+0.5));53 }54 putchar(‘\n‘);55 return 0;56 }57 58 void FFT(Complex* a,int len,int opt){59 for(int i=0;i<len;i++)60 if(i<rev[i])61 std::swap(a[i],a[rev[i]]);62 for(int i=1;i<len;i<<=1){63 Complex wn=Complex(cos(PI/i),opt*sin(PI/i));64 int step=i<<1;65 for(int j=0;j<len;j+=step){66 Complex w=Complex(1,0);67 for(int k=0;k<i;k++,w=w*wn){68 Complex x=a[j+k];69 Complex y=w*a[j+k+i];70 a[j+k]=x+y;71 a[j+k+i]=x-y;72 }73 }74 }75 }76 77 void Initialize(){78 scanf("%d%d",&n,&m);79 len=n+m;80 while(bln<=len){81 bct++;82 bln<<=1;83 }84 for(int i=0;i<bln;i++){85 rev[i]=(rev[i>>1]>>1)|((i&1)<<(bct-1));86 }87 for(int i=0;i<=n;i++){88 scanf("%lf",&a[i].real);89 }90 for(int i=0;i<=m;i++){91 scanf("%lf",&b[i].real);92 }93 }
以及日常图包OwO
[UOJ 0034] 多项式乘法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。