HDU 1402 A * B Problem Plus FFT

来源:互联网 发布:淘宝异常订单处理中心 编辑:程序博客网 时间:2024/05/21 07:05

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
1210002
 

Sample Output
22000
 

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 400044using 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;}



0 0
原创粉丝点击