您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fft