[UOJ#34]多项式乘法(FFT)
2017-08-23 18:58
423 查看
题目:我是超链接
题解:
FFT板子一发,码着再看。
代码:
题解:
FFT板子一发,码着再看。
代码:
#include <cstdio> #include <iostream> #include <cmath> #define N 300005 using namespace std; const double pi=acos(-1.0); int n,m,L,r ; struct complex { double x,y; complex(double X=0,double Y=0) {x=X,y=Y;} }a ,b ; complex operator +(complex a,complex b){return complex(a.x+b.x,a.y+b.y);} complex operator -(complex a,complex b){return complex(a.x-b.x,a.y-b.y);} complex operator *(complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);} void FFT(complex a ,int id) { for (int i=0;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]); for (int k=1;k<n;k<<=1) { complex wn=complex(cos(pi/k),id*sin(pi/k)); for (int i=0;i<n;i+=(k<<1)) { complex w=complex(1,0); for (int j=0;j<k;j++,w=w*wn) { complex x=a[i+j],y=w*a[i+j+k]; a[i+j]=x+y,a[i+j+k]=x-y; } } } } int main() { scanf("%d%d",&n,&m); for (int i=0;i<=n;i++) scanf("%lf",&a[i].x); for (int i=0;i<=m;i++) scanf("%lf",&b[i].x); m+=n; for (n=1;n<=m;n<<=1) ++L; for (int i=0;i<n;i++) r[i]=(r[i>>1]>>1) | ((i&1)<<(L-1)); 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%c",(int)(a[i].x/n+0.5)," \n"[i==m]); }
相关文章推荐
- [uoj 34 多项式乘法] FFT&NTT 模板
- [UOJ 34]多项式乘法(FFT)
- [uoj 34 多项式乘法] FFT&NTT 模板
- 【UOJ 34】 多项式乘法 (FFT)
- [UOJ#34]多项式乘法(FFT)
- uoj 34 多项式乘法(fft入门)
- FFT uoj34 多项式乘法
- [UOJ34]多项式乘法(快速傅立叶变换FFT)
- [省选前题目整理][UOJ 34]多项式乘法(FFT)
- 【UOJ 34】 #34. 多项式乘法 (FFT)
- 【FFT优化】[UOJ#34]多项式乘法
- UOJ34 多项式乘法 fft板子
- UOJ 34 多项式乘法(FFT)
- 【UOJ 34】多项式乘法
- 【NTT模板】[UOJ#34]多项式乘法
- ●UOJ 34 多项式乘法
- UOJ34 多项式乘法
- UOJ 34 多项式乘法 ——NTT
- UOJ#34 多项式乘法(FFT模板题)
- [UOJ#34]多项式乘法