bzoj 2179 FFT快速傅里叶
2017-04-25 12:31
375 查看
真 · 背板子。好像是用到了分治思想。
#include<cmath> #include<cstdio> #include<cstring> #include<complex> #include<iostream> using namespace std; double pi=acos(-1); typedef complex<double> E; E a[140005],b[140005]; void fft(E *x,int n,int type) { if(n==1) return ; E l[n>>1],r[n>>1]; for(int i=0;i<n;i+=2) l[i>>1]=x[i],r[i>>1]=x[i+1]; fft(l,n>>1,type);fft(r,n>>1,type); E wn(cos(2*pi/n),sin(type*2*pi/n)),w(1,0),t; for(int i=0;i<n>>1;i++,w*=wn) t=w*r[i],x[i]=l[i]+t,x[i+(n>>1)]=l[i]-t; } int w[140005]; char A[60005],B[60005]; double eps=0.01; int main() { int n; scanf("%d",&n); scanf("%s%s",A,B); for(int i=0;i<n;i++) a[i]=A[n-i-1]-'0'; for(int i=0;i<n;i++) b[i]=B[n-i-1]-'0'; int m=n*2-2;for(n=1;n<=m;n<<=1); fft(a,n,1);fft(b,n,1); for(int i=0;i<n;i++) a[i]*=b[i]; fft(a,n,-1); for(int i=0;i<n;i++) w[i]=a[i].real()/n+0.5; for(int i=0;i<=m;i++) if(w[i]>=10) { w[i+1]+=w[i]/10;w[i]%=10; if(i==m) m++; } for(int i=m;i>=0;i--) printf("%d",w[i]); return 0; }
相关文章推荐
- BZOJ 2179 FFT快速傅里叶
- [bzoj2179][快速傅里叶][ntt]FFT快速傅立叶
- 【BZOJ】【2179】FFT快速傅里叶
- BZOJ 2179 FFT快速傅立叶 快速傅里叶变换
- 【BZOJ 2179】【FFT模板】 FFT快速傅立叶
- 【bzoj2179】FFT快速傅立叶 FFT模板
- bzoj2179 FFT快速傅立叶
- [BZOJ2179]FFT快速傅立叶
- bzoj2179 FFT快速傅立叶
- bzoj 2179: FFT快速傅立叶 (FFT)
- BZOJ 2179 FFT快速傅立叶 题解
- BZOJ 2179 FFT快速傅立叶 FFT
- bzoj2179 FFT快速傅立叶
- [bzoj2179]FFT快速傅立叶
- BZOJ 2179(FFT快速傅立叶-FFT)
- bzoj2179: FFT快速傅立叶
- BZOJ 2179: FFT快速傅立叶
- bzoj2179 FFT快速傅立叶 (FFT)
- BZOJ 2179: FFT快速傅立叶
- 【BZOJ-2179&2194】FFT快速傅里叶&快速傅里叶之二 FFT