zoukankan      html  css  js  c++  java
  • hdu 1402 A * B Problem Plus fft

    题目链接

    A * B Problem Plus

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 16382    Accepted Submission(s): 3325


    Problem Description
    Calculate A * B.
     
    Input
    Each line will contain two integers A and B. Process to end of file.

    Note: the length of each integer will not exceed 50000.
     
    Output
    For each case, output A * B in one line.
     
    Sample Input
    1 2 1000 2
     
    Sample Output
    2 2000
     
     
    fft模板题。
     
    #include <iostream>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <map>
    #include <set>
    #include <string>
    #include <queue>
    #include <complex>
    #include <stack>
    #include <bitset>
    using namespace std;
    #define pb(x) push_back(x)
    #define ll long long
    #define mk(x, y) make_pair(x, y)
    #define lson l, m, rt<<1
    #define mem(a) memset(a, 0, sizeof(a))
    #define rson m+1, r, rt<<1|1
    #define mem1(a) memset(a, -1, sizeof(a))
    #define mem2(a) memset(a, 0x3f, sizeof(a))
    #define rep(i, n, a) for(int i = a; i<n; i++)
    #define fi first
    #define se second
    typedef pair<int, int> pll;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int mod = 1e9+7;
    const int inf = 1061109567;
    const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    typedef complex <double> cmx;
    void change(cmx 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(cmx y[],int len,int on)
    {
        change(y,len);
        for(int h = 2; h <= len; h <<= 1)
        {
            cmx wn(cos(-on*2*PI/h),sin(-on*2*PI/h));
            for(int j = 0;j < len;j+=h)
            {
                cmx w(1,0);
                for(int k = j;k < j+h/2;k++)
                {
                    cmx u = y[k];
                    cmx 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] /= len;
    }
    const int maxn = 200010;
    int ans[maxn];
    cmx x1[maxn], x2[maxn];
    char s1[50005], s2[50005];
    int main()
    {
        while(~scanf("%s%s", s1, s2)) {
            int len1 = strlen(s1);
            int len2 = strlen(s2);
            mem(ans);
            int len = 1;
            while(len<len1*2 || len<len2*2)
                len<<=1;
            for(int i = 0; i<len1; i++) {
                x1[i] = cmx(s1[len1-i-1]-'0', 0);
            }
            for(int i = len1; i<len; i++)
                x1[i] = cmx(0, 0);
            for(int i = 0; i<len2; i++) {
                x2[i] = cmx(s2[len2-i-1]-'0', 0);
            }
            for(int i = len2; i<len; i++)
                x2[i] = cmx(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++)
                ans[i] = (int)(x1[i].real() + 0.5);
            for(int i = 0; i<len; i++) {
                ans[i+1] += ans[i]/10;
                ans[i]%=10;
            }
            len = len1+len2-1;
            while(len>0&&ans[len]==0)
                len--;
            for(int i = len; i>=0; i--)
                printf("%d", ans[i]);
            cout<<endl;
        }
        return 0;
    }
  • 相关阅读:
    C#LPT端口连接热敏打印机发送指令
    c# 普通打印机大致有三种方法(非热敏打印机及lpt1并口指令控制型)
    C#直接发送打印机命令到打印机(这里测试的是直接弹出钱箱操作)
    c#操作access,update语句不执行的解决办法
    element-ui dialog组件添加可拖拽位置 可拖拽宽高[转]
    [JavaScript] js实现简单的代码运行框【转】
    HTML5 drag & drop 拖拽与拖放简介[转]
    webpack 单独打包指定JS文件(转)
    跳转地图并定位
    基于Cesium实现逼真的水特效[转]
  • 原文地址:https://www.cnblogs.com/yohaha/p/5234521.html
Copyright © 2011-2022 走看看