【UOJ 34】 #34. 多项式乘法 (FFT)
2017-04-13 16:43
357 查看
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #include<cmath> 7 #include<complex> 8 #define Maxn 262145 9 #define pi acos(-1) 10 using namespace std; 11 12 struct P 13 { 14 double x,y; 15 P() {x=y=0;} 16 P(double x,double y):x(x),y(y){} 17 friend P operator + (P x,P y) {return P(x.x+y.x,x.y+y.y);} 18 friend P operator - (P x,P y) {return P(x.x-y.x,x.y-y.y);} 19 friend P operator * (P x,P y) {return P(x.x*y.x-x.y*y.y,x.x*y.y+x.y*y.x);} 20 }a[Maxn],b[Maxn]; 21 22 int nn; 23 int R[Maxn]; 24 void fft(P *a,int f) 25 { 26 for(int i=0;i<nn;i++) if(i<R[i]) swap(a[i],a[R[i]]); 27 for(int i=1;i<nn;i<<=1) 28 { 29 P wn(cos(pi/i),f*sin(pi/i)); 30 for(int j=0;j<nn;j+=i<<1) 31 { 32 P w(1,0); 33 for(int k=0;k<i;k++,w=w*wn) 34 { 35 P x=a[j+k],y=w*a[j+k+i]; 36 a[j+k]=x+y;a[j+k+i]=x-y; 37 } 38 } 39 } 40 } 41 int main() 42 { 43 freopen("a.in","r",stdin); 44 freopen("b.out","w",stdout); 45 int n,m; 46 scanf("%d%d",&n,&m); 47 for(int i=0;i<=n;i++) scanf("%lf",&a[i].x); 48 for(int i=0;i<=m;i++) scanf("%lf",&b[i].x); 49 int ll=0;nn=1; 50 while(nn<=n+m) ll++,nn<<=1; 51 for(int i=0;i<nn;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(ll-1)); 52 fft(a,1);fft(b,1); 53 for(int i=0;i<=nn;i++) a[i]=a[i]*b[i]; 54 fft(a,-1); 55 for(int i=0;i<=n+m;i++) printf("%d ",(int)(a[i].x/nn+0.5)); 56 return 0; 57 }
View Code
2017-04-13 16:43:54
相关文章推荐
- [省选前题目整理][UOJ 34]多项式乘法(FFT)
- UOJ 34 多项式乘法(FFT)
- UOJ34 多项式乘法 fft板子
- [uoj 34 多项式乘法] FFT&NTT 模板
- 【UOJ 34】 多项式乘法 (FFT)
- 【FFT优化】[UOJ#34]多项式乘法
- [UOJ 34]多项式乘法(FFT)
- [uoj 34 多项式乘法] FFT&NTT 模板
- [UOJ#34]多项式乘法(FFT)
- [UOJ#34]多项式乘法(FFT)
- FFT uoj34 多项式乘法
- uoj 34 多项式乘法(fft入门)
- [UOJ34]多项式乘法(快速傅立叶变换FFT)
- UOJ 34 多项式乘法 ——NTT
- UOJ#34 多项式乘法(FFT模板题)
- 【快速傅里叶变换】[UOJ#34]多项式乘法
- [UOJ 34]多项式乘法
- UOJ #34 多项式乘法
- UOJ34 多项式乘法(非递归版)
- 【UOJ 34】多项式乘法