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

    A * B Problem Plus HDU - 1402 (FFT)
    Calculate A * B. 

    InputEach line will contain two integers A and B. Process to end of file. 

    Note: the length of each integer will not exceed 50000. 
    OutputFor each case, output A * B in one line. 
    Sample Input

    1
    2
    1000
    2

    Sample Output

    2
    2000


    题意:求A*B,A和B的长度都小于50000
    题解:FFT的板子题,但FFT还不会,之后再贴一些想法
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<sstream>
    #include<cmath>
    #include<stack>
    #include<map>
    #include<cstdlib>
    #include<vector>
    #include<string>
    #include<queue>
    using namespace std;
    
    #define ll long long
    #define llu unsigned long long
    #define INF 0x3f3f3f3f
    const double PI = acos(-1.0);
    const int maxn =  2e5+10;
    const int mod = 1e9+7;
    
    
    struct Complex{
        double x,y;
        Complex(double _x=0.0,double _y = 0.0){
            x = _x;
            y = _y;
        }
        Complex operator -(const Complex &b)const{
            return Complex(x-b.x,y-b.y);
        }
        Complex operator +(const Complex &b)const{
            return Complex(x+b.x,y+b.y);
        }
        Complex operator *(const Complex &b)const{
            return Complex(x*b.x-y*b.y,x*b.y+y*b.x);
        }
    };
    
    void change(Complex y[],int len){
        int i,j,k;
        for( i=1,j=len/2;i<len-1;i++)
        {
            if(i<j)
                swap(y[i],y[j]);
            k=len/2;
            while(j>=k)
            {
                j -= k;
                k /= 2;
            }
            if(j < k)
                j += k;
        }
    }
    
    void fft(Complex y[],int len,int on){
        change(y,len);
        for(int h=2;h<=len;h <<= 1){
            Complex wn(cos(-on * 2 * PI /h),sin(-on*2*PI/h));
            for(int j=0;j<len;j+=h){
                Complex w(1,0);
                for(int k=j;k<j+h/2;k++){
                    Complex u = y[k];
                    Complex t = w*y[k+h/2];
                    y[k] = u+t;
                    y[k+h/2] = u-t;
                    w = w*wn;
                }
            }
        }
        if(on == -1)
            for(int i=0;i<len;i++)
                y[i].x/=len;
    }
    
    Complex x1[maxn],x2[maxn];
    char str1[maxn/2],str2[maxn/2];
    int sum[maxn];
    int main()
    {
        while(scanf("%s",str1) != EOF)
        {
            scanf("%s", str2);
            int len1 = strlen(str1);
            int len2 = strlen(str2);
            int len = 1;
            while(len < len1*2 || len < len2*2)
                len<<=1;
            for(int i=0;i<len1;i++)
                x1[i] = Complex(str1[len1-1-i]-'0',0);
            for(int i=len1;i<len;i++)
                x1[i] = Complex(0,0);
            for(int i=0;i<len2;i++)
                x2[i] = Complex(str2[len2-1-i]-'0',0);
            for(int i=len2;i<len;i++)
                x2[i] = Complex(0,0);
            fft(x1,len,1);
            fft(x2,len,1);
            for(int i=0;i<len;i++)
                x1[i] = x1[i]*x2[i];
            fft(x1,len,-1);
            for(int i=0;i<len;i++)
                sum[i] = (int)(x1[i].x + 0.5);
            for(int i=0;i<len;i++){
                sum[i+1]  += sum[i]/10;
                sum[i] %= 10;
            }
            len = len1+len2-1;
            while(sum[len] <= 0 && len > 0)
                len--;
            for(int i=len;i>=0;i--)
                printf("%c",sum[i]+'0');
            printf("
    ");
        }
    }
  • 相关阅读:
    我的游戏学习日志54———类型游戏策划(1)—动作游戏(1)
    我的游戏学习日志53——游戏游戏策划—小结
    IE8下Extjs报缺少':'符号错误
    Extjs 兼容IE8常见问题及解决方法
    程序员如何提升自己
    extjs layout 最灵活的页面布局样式
    如何运用军事战略建立更好的习惯
    Ext之页面多次请求问题 (下拉框发送无关请求)
    计算机网络通信那些事
    Java基础
  • 原文地址:https://www.cnblogs.com/smallhester/p/10327424.html
Copyright © 2011-2022 走看看