#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 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 a 34 int m; //Length of b 35 int bln=1; //Binary Length 36 int bct; //Bit Count 37 int len; //Length Sum 38 int rev[MAXN]; //Binary Reverse Sort 39 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 }
Backup
以及日常图包OwO
时间: 2024-10-12 13:46:14