HDU 1402 A * B Problem Plus(FFT)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1402

题意:给出两个非负整数,求他们的乘积。

思路:FFT。




struct node
{
    double x,y;
    
    node(double _x=0.0,double _y=0.0)
    {
        x=_x;
        y=_y;
    }
    
    node operator+(node a)
    {
        return node(x+a.x,y+a.y);
    }
    
    node operator-(node a)
    {
        return node(x-a.x,y-a.y);
    }
    
    node operator*(node a)
    {
        return node(x*a.x-y*a.y,x*a.y+y*a.x);
    }
};




node A[N];
int L;


int reverse(int x)
{
    int ans=0,i;
    FOR0(i,L) if(x&(1<<i)) ans|=1<<(L-1-i);
    return ans;
}


void bitReverseCopy(node a[],int n)
{
    int i;
    FOR0(i,n) A[i]=a[i];
    FOR0(i,n) 
    {
        a[reverse(i)]=A[i];
    }
}


void fft(node a[],int n,int on)
{
    bitReverseCopy(a,n);
    int len,i,j,k;
    node x,y,u,t;
    for(len=2;len<=n;len<<=1)
    {
        x=node(cos(-on*2*PI/len),sin(-on*2*PI/len));
        for(j=0;j<n;j+=len)
        {
            y=node(1,0);
            for(k=j;k<j+len/2;k++)
            {
                u=a[k];
                t=y*a[k+len/2];
                a[k]=u+t;
                a[k+len/2]=u-t;
                y=y*x;
            }
        }
    }
    if(on==-1)
    {
        FOR0(i,n) a[i].x/=n;
    }
}




node a[N],b[N];
char s1[N],s2[N];
int n,ans[N];


int main()
{
    while(scanf("%s%s",s1,s2)!=-1)
    {
        int len1=strlen(s1);
        int len2=strlen(s2);
        n=1; L=0;
        while(n<len1+len2) n<<=1,L++;
        int i;
        FOR0(i,len1) a[i]=node(s1[len1-1-i]-'0',0);
        FOR0(i,len2) b[i]=node(s2[len2-1-i]-'0',0);
        for(i=len1;i<n;i++) a[i]=node(0,0);
        for(i=len2;i<n;i++) b[i]=node(0,0);
        fft(a,n,1);
        fft(b,n,1);
        FOR0(i,n) a[i]=a[i]*b[i];
        fft(a,n,-1);
        clr(ans,0);
        FOR0(i,n) ans[i]=(int)(a[i].x+0.5);
        FOR0(i,n) ans[i+1]+=ans[i]/10,ans[i]%=10;
        for(i=n-1;i>0&&!ans[i];i--);
        while(i>=0) printf("%d",ans[i--]);
        puts("");
    }
}

你可能感兴趣的:(HDU)