1. 程式人生 > >hdu1402 A * B Problem Plus (FFT)

hdu1402 A * B Problem Plus (FFT)

思路考慮變成係數的形式,顯然就是兩個的多項式乘法,然後轉化成FFT,直接莽一波就完了。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;


const int N = 500005;
const double pi = acos(-1.0);

char s1[N],s2[N];
int len,res[N];

struct Complex
{
    double r,i;
    Complex(double r=0,double i=0):r(r),i(i) {};
    Complex operator+(const Complex &rhs)
    {
        return Complex(r + rhs.r,i + rhs.i);
    }
    Complex operator-(const Complex &rhs)
    {
        return Complex(r - rhs.r,i - rhs.i);
    }
    Complex operator*(const Complex &rhs)
    {
        return Complex(r*rhs.r - i*rhs.i,i*rhs.r + r*rhs.i);
    }
} va[N],vb[N];

void rader(Complex F[],int len) //len = 2^M,reverse F[i] with  F[j] j為i二進位制反轉
{
    int j = len >> 1;
    for(int i = 1;i < len - 1;++i)
    {
        if(i < j) swap(F[i],F[j]);  // reverse
        int k = len>>1;
        while(j>=k)
        {
            j -= k;
            k >>= 1;
        }
        if(j < k) j += k;
    }
}

void FFT(Complex F[],int len,int t)
{
    rader(F,len);
    for(int h=2;h<=len;h<<=1)
    {
        Complex wn(cos(-t*2*pi/h),sin(-t*2*pi/h));
        for(int j=0;j<len;j+=h)
        {
            Complex E(1,0); //旋轉因子
            for(int k=j;k<j+h/2;++k)
            {
                Complex u = F[k];
                Complex v = E*F[k+h/2];
                F[k] = u+v;
                F[k+h/2] = u-v;
                E=E*wn;
            }
        }
    }
    if(t==-1)   //IDFT
        for(int i=0;i<len;++i)
            F[i].r/=len;
}

void Conv(Complex a[],Complex b[],int len) //求卷積
{
    FFT(a,len,1);
    FFT(b,len,1);
    for(int i=0;i<len;++i) a[i] = a[i]*b[i];
    FFT(a,len,-1);
}

void init(char *s1,char *s2)
{
    int n1 = strlen(s1),n2 = strlen(s2);
    len = 1;
    while(len < 2*n1 || len < 2*n2) len <<= 1;
    int i;
    for(i=0;i<n1;++i)
    {
        va[i].r = s1[n1-i-1]-'0';
        va[i].i = 0;
    }
    while(i<len)
    {
        va[i].r = va[i].i = 0;
        ++i;
    }
    for(i=0;i<n2;++i)
    {
        vb[i].r = s2[n2-i-1]-'0';
        vb[i].i = 0;
    }
    while(i<len)
    {
        vb[i].r = vb[i].i = 0;
        ++i;
    }
}

void gao()
{
    Conv(va,vb,len);
    memset(res,0,sizeof res);
    for(int i=0;i<len;++i)
    {
        res[i]=va[i].r + 0.5;
    }
    for(int i=0;i<len;++i)
    {
        res[i+1]+=res[i]/10;
        res[i]%=10;
    }
    int high = 0;
    for(int i=len-1;i>=0;--i)
    {
        if(res[i])
        {
            high = i;
            break;
        }
    }
    for(int i=high;i>=0;--i) putchar('0'+res[i]);
    puts("");
}


int main()
{
    while(scanf("%s %s",s1,s2)==2)
    {
        init(s1,s2);
        gao();
    }
    return 0;
}


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

相關推薦

hdu1402 A * B Problem Plus FFT

思路:考慮變成係數的形式,顯然就是兩個的多項式乘法,然後轉化成FFT,直接莽一波就完了。 #include<cstdio> #include<cmath> #include<cstring> #include<algorithm&

HDU 1402 A * B Problem Plus ——大數乘法,FFT

兩個 ret 處理 complex truct std spa strlen mes   因為剛學fft,想拿這題練練手,結果WA了個爽= =。   總結幾點犯的錯誤:   1.要註意處理前導零的問題。   2.一定要註意數組大小的問題。(前一個fft的題因為沒用到b數組,

hdu1402 A * B Problem Plus

很裸的FFT。 原理到處都有(看演算法導論就可以學懂了)。 #include<bits/stdc++.h> using namespace std; typedef complex<double> cpx; const int MAXN = 50

HDU 1402 A * B Problem Plus FFT

contain linker pri span stack pragma mod exce problem A * B Problem Plus Problem Description Calculate A * B. Input Each line

HDU1402A * B Problem Plus——題解

|| name nbsp pro style plus string stream size http://acm.hdu.edu.cn/showproblem.php?pid=1402 給出兩個高精度正整數,求它們的積,最長的數長度不大於5e4。 FFT裸題,

題解報告:hdu 1002 A + B Problem II大數加法

return 大數類 class family HERE contains urn integer ons Problem Description I have a very simple problem for you. Given two integers A and

HDU - 1402 A * B Problem Plus FFT裸題

swa complex asn 直線 lse () strlen mod -i http://acm.hdu.edu.cn/showproblem.php?pid=1402 題意:   求$a*b$ 但是$a$和$b$的範圍可以達到 $1e50000$ 題解:   顯然..

HDU 1402 A * B Problem Plus ( FFT )

amp hid sin 兩個 close 形式 hide utc closed 題意 : 求兩個大數相乘的結果 分析 : 可以將數拆成多項式的形式 例如 12345 (1 * x^4) + (2 * x^3) + (3 * x^2) + (4 * x^1) + (5 *

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): 15111    Acc

A + B Problem II高精度計算

#include<stdio.h> #include<string.h> main() { int n; int i,ka,kb,j=1,k,x; char a1[1000],b1[1000]; scanf("%d",&

1001 A + B Problem IIC語言 大數加法模板

#include<stdio.h> int len(char *a)//一個判斷字串長度的函式與strlen一樣 { int i=0; while(*a++!='\0') { i++; } return i; } /*************

HDU 1402 A * B Problem Plus(FFT實現高精度乘法)

題意:50000位以內的高精度乘法。 思路:熟悉一下FFT的用法。多項式的乘法實際上是多項式係數向量的卷積,利用FFT進行多項式乘法,步驟如下: 1.補零:在兩個多項式的最前面補零,得到兩個2n次的多項式,設係數向量分別為v1,v2。 2.求值:用FFT計算f1 = DFT

HDU1042 A * B Problem Plus

itl namespace div mem accepted return sample tle esc A * B Problem Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536

B1011. A+B和C15

B1011. A+B和C(15) Time Limit:50ms Memory Limit:65536KB 題目描述 給定區間[-231,231]內的三個整數A、B、C,請判斷A+B是否大於C。 輸入格式 第一行給出正整數T(<=10),即測試

還是A+B HDU - 1229數學題

以k為迴圈變數 #include <stdio.h> int main() {     int a, b, k;     while(~scanf("%d %d %d", &a, &b, &a

PAT 乙級 1001-A+B和C15

給定區間[-2的31次方, 2的31次方]內的3個整數A、B和C,請判斷A+B是否大於C。 輸入描述: 輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每

python的 a,b=b,a+ba=b b=a+b 的區別經典

剛剛我在學習python的時候,發現下面的這個賦值要把給繞暈了(思考了很久),所以我整理之後寫下博文, 希望對未來的學弟學妹有幫助! 永遠愛你們的! ————新寶寶

A+B for MatricesJAVA

題目描述:     This time, you are supposed to find A+B where A and B are two matrices, and then count the number of zero rows and columns. 輸入

A*B problemFFT

esp mat ble struct operator for fin void gist #include<iostream> #include<cstdio> #include<cstring> #include<cmath&

[Luogu 1919]【模板】A*B Problem升級版FFT快速傅裏葉

vector sample lex cstring 模板 rip putc -s and Description 給出兩個n位10進制整數x和y,你需要計算x*y。 Input 第一行一個正整數n。 第二行描述一個位數為n的正整數x。 第三行描述一個位數為n的正整數y