FFT

#include"iostream"
#include"string.h"
#include"math.h"
using namespace std;
const double pi=acos(-1);
struct complex
{
    double r,i;
    complex(double r=0,double i=0)
    {
        this->r=r;
        this->i=i;
    }

};
complex operator + (complex a,complex b)
{
    complex ans;
    ans.r=a.r+b.r;
    ans.i=a.i+b.i;
    return ans;
}
complex operator - (complex a,complex b)
{
    complex ans;
    ans.r=a.r-b.r;
    ans.i=a.i-b.i;
    return ans;
}
complex operator * (complex a,complex b)
{
    complex ans;
    ans.r=a.r*b.r-a.i*b.i;
    ans.i=a.r*b.i+a.i*b.r;
    return ans;
}

void Rader(complex *f,int len)
{
    for(int i=1,j=len/2;i<len-1;i++)
    {
        if(i<j)swap(f[i],f[j]);
        int k=len/2;
        while(j>=k)
        {
            j-=k;
            k>>=1;
        }
        if(j<k)j+=k;
    }
}
void FFT(complex f[],int len,int on)
{
    Rader(f,len);
    for(int N=2;N<=len;N<<=1)
    {
        complex w(cos(-on*2.0*pi/N),sin(-on*2.0*pi/N));
        for(int j=0;j<len;j+=N)
        {
            complex Wn(1,0);
            for(int k=j;k-j<N/2;k++)
            {
                complex t1,t2;
                t1=f[k];
                t2=f[k+N/2]*Wn;
                f[k]=t1+t2;
                f[k+N/2]=t1-t2;
                Wn=Wn*w;
            }
        }
    }
    if(on==-1)
    {
        for(int i=0;i<len;i++)f[i].r/=1.0*len;
    }
}

string operator *(string s1,string s2)
{
    int len=1;
    while(len<s1.length()+s2.length())len<<=1;
    complex f[len],f1[len];
    int t=0;
    for(int i=s1.length()-1;i>=0;i--)
    {
        f[t].r=s1[i]-'0';
        f[t++].i=0;
    }
    while(t++<len)f[t].r=f[t].i=0;
    t=0;
    for(int i=s2.length()-1;i>=0;i--)
    {
        f1[t].r=s2[i]-'0';
        f1[t++].i=0;
    }
    while(t++<len)f1[t].r=f1[t].i=0;
    FFT(f,len,1);
    FFT(f1,len,1);
    for(int i=0;i<len;i++)f[i]=f[i]*f1[i];
    FFT(f,len,-1);

    int a[len];
    memset(a,0,sizeof(a));
    for(int i=0;i<len-1;i++)
    {
        a[i]+=f[i].r+0.5;
        a[i+1]+=a[i]/10;
        a[i]%=10;
    }
    a[len-1]+=f[len-1].r+0.5;
    t=len-1;
    while(a[t]==0)t--;
    string ans;
    for(int i=t;i>=0;i--)
    {
        ans+=a[i]+'0';
    }
    return ans;
}

int main()
{
    string s1,s2;
    cin>>s1>>s2;
    cout<<s1*s2;


}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务