bzoj 2179 FFT快速傅里叶

来源:互联网 发布:中国建筑业数据库 编辑:程序博客网 时间:2024/06/16 02:31

真 · 背板子。好像是用到了分治思想。

#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;}
1 0
原创粉丝点击