zoukankan      html  css  js  c++  java
  • HDU 1402 A*B

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define ms(s,a) memset(s,a,sizeof(s))
    #define debug(x) cout<<"< "#x" = "<<x<<" >
    "
    const double pi=3.1415926536;
    
    const int maxn=3e5+5;
    complex<double> a[maxn],b[maxn],c[maxn];
    
    void rearrange(complex<double> x[],int n)
    {
        for(int i=1,j=n/2;i<n;++i)
        {
            if(i<j)swap(x[i],x[j]);
            int tmp=n/2;
            while(tmp&&j>=tmp){j-=tmp;tmp/=2;}
            if(j<tmp)j+=tmp;
        }
    }
    void fft(complex<double> x[],int n,int sig)
    {
        rearrange(x,n);
        for(int i=2;i<=n;i*=2)
        {
            for(int j=0;j<n;j+=i)
            {
                for(int k=j;k<j+i/2;++k)
                {
                    complex<double> e=x[k],o=x[k+i/2],w=exp(complex<double>(0,sig*2.*pi*(k-j)/i));
                    x[k]=e+w*o;
                    x[k+i/2]=e-w*o;
                }
            }
        }
        if(sig==-1)
        {
            for(int i=0;i<n;++i)x[i]/=n;
        }
    }
    int main()
    {
        char A[50005],B[50005];
        while(~scanf("%s%s",A,B))
        {
            int la=strlen(A),lb=strlen(B);
            int tot=1;
            while(tot<la+lb-1)tot*=2;
            for(int i=0;i<tot;++i)
            {
                int tmp=0;
                if(i<la)tmp=A[i]-'0';
                a[i]=tmp;
            }
            for(int i=0;i<tot;++i)
            {
                int tmp=0;
                if(i<lb)tmp=B[i]-'0';
                b[i]=tmp;
            }
            fft(a,tot,1);fft(b,tot,1);
            for(int i=0;i<tot;++i)c[i]=a[i]*b[i];
            fft(c,tot,-1);
            //for(int i=0;i<la+lb-1;++i)printf("%lf,",c[i].real());
            //printf("
    ");
            int ans[maxn],top=la+lb-2;
            memset(ans,0,sizeof ans);
            for(int i=0;i<tot;++i)
            {
                ans[i]=ans[i]+c[la+lb-2-i].real()+0.5;
                if(i>la+lb-3&&ans[i]==0)break;
                if(ans[i]>9)
                {
                    ans[i+1]=ans[i]/10;
                    ans[i]%=10;
                    if(i>la+lb-3)top++;
                }
    
            }
            while(top>0&&ans[top]==0)top--;
            while(top>-1)printf("%d",ans[top--]);
            printf("
    ");
        }
    }
    
  • 相关阅读:
    序列合并(luogu 1631)题解
    邮递员送信(luogu 1629)题解
    敲砖块(codevs 1257)题解
    货车运输(codevs 3287)题解
    分布式服务框架 Zookeeper -- 管理分布式环境中的数据
    dubbo学习
    第一章 1.20 多线程基础
    第一章 1.19 网络编程基础
    练习 : 面向对象
    练习 : 正则表达式
  • 原文地址:https://www.cnblogs.com/maoruimas/p/9733638.html
Copyright © 2011-2022 走看看