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): 13959    Accepted Submission(s): 2516


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
 

Author
DOOM III


由於數字信號系統正在學FFT,正好來寫寫相關的問題。

FFT快速求解循環卷積,從而得到線性卷積,具體理論我將整理後再發。

先寫個經典的大數相乘吧XD。


/** Author: ☆·aosaki(*’(OO)’*)  niconiconi★ **/
#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <list>
#include <stack>
//#include <tuple>
#define mem(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define lp(k,a) for(int k=1;k<=a;k++)
#define lp0(k,a) for(int k=0;k<a;k++)
#define lpn(k,n,a) for(int k=n;k<=a;k++)
#define lpd(k,n,a) for(int k=n;k>=a;k--)
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
#define lowbit(x) (x&(-x))
#define ll long long
#define pi pair<int,int>
#define vi vector<int>
#define PI acos(-1.0)
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define TT cout<<"*****"<<endl;
#define TTT cout<<"********"<<endl;
inline int gcd(int a,int b)
{
    return a==0?b:gcd(b%a,a);
}
#define INF 1e9
#define eps 1e-8
#define mod 10007
#define MAX 400044
using namespace std;

char s1[50010],s2[50010];

struct complex
{
    double r,i;
    complex(double _r = 0,double _i = 0)
    {
        r = _r; i = _i;
    }
    complex operator +(const complex &b)
    {
        return complex(r+b.r,i+b.i);
    }
    complex operator -(const complex &b)
    {
        return complex(r-b.r,i-b.i);
    }
    complex operator *(const complex &b)
    {
        return complex(r*b.r-i*b.i,r*b.i+i*b.r);
    }
};

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].r/=len;
}


complex x1[200010],x2[200010];
int sum[200010];
int main()
{
    //freopen("in.txt","r",stdin);
    register int i;
    while(~scanf("%s%s",s1,s2))
    {
        int len1=strlen(s1);
        int len2=strlen(s2);
        int l=1;

        while(l<len1*2 || l<len2*2) l<<=1;
        for(i=0;i<len1;i++)
        {
            x1[i].r=s1[len1-i-1]-'0';
            x1[i].i=0.0;
        }
        for(;i<l;i++)
             x1[i].r=x1[i].i=0.0;
        for(i=0;i<len2;i++)
        {
            x2[i].r=s2[len2-i-1]-'0';
            x2[i].i=0.0;
        }
        for(;i<l;i++)
          x2[i].r=x2[i].i=0.0;
        fft(x1,l,1);
        fft(x2,l,1);
        for(i=0;i<l;i++) x1[i]=x1[i]*x2[i];
        fft(x1,l,-1);
        for(i=0;i<l;i++) sum[i]=x1[i].r+0.5;
        for(i=0;i<l;i++)
        {
            sum[i+1]+=sum[i]/10;
            sum[i]%=10;
        }
        l=len1+len2-1;
        while(sum[l]<=0 && l>0) l--;
        for(i=l;i>=0;i--)   putchar(sum[i]+'0');
        putchar('\n');
    }
    return 0;
}



發佈了35 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章