hdu 1402 A * B Problem Plus[【FFT】

来源:互联网 发布:mac中照片的存储位置 编辑:程序博客网 时间:2024/05/17 18:46

 这是一道FFT模板题,然而菜鸟还是WA好多发。。。

代码:

#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#include<map>#include<string>#include<queue>#include<vector>#include<list>#include<bitset>//#pragma comment(linker,"/STACK:1024000000,1024000000")using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define N 200005const double PI = acos(-1.0);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[N],x2[N];char a[N/4],b[N/4];int num[N];int main(){    while(~scanf("%s%s",a,b))    {        int len1=strlen(a);        int len2=strlen(b);        int l=1;        while(l<len1+len2) l<<=1;        for(int i=len1-1;i>=0;i--) x1[i]=complex(a[len1-i-1]-'0',0);        for(int i=len1;i<l;i++) x1[i]=complex(0,0);        for(int i=len2-1;i>=0;i--) x2[i]=complex(b[len2-i-1]-'0',0);        for(int i=len2;i<l;i++) x2[i]=complex(0,0);        fft(x1,l,1);        fft(x2,l,1);        for(int i=0;i<l;i++) x1[i]=x1[i]*x2[i];        fft(x1,l,-1);        for(int i=0;i<l;i++) num[i]=x1[i].r+0.5;        for(int i=0;i<l;i++)        {            num[i+1]+=num[i]/10;            num[i]%=10;        }        l=len1+len2-1;        int f=0;        for(int i=l;i>=0;i--)        {            if(!f&&num[i]==0) continue;            f=1;            printf("%d",num[i]);        }        if(!f) puts("0");        else puts("");    }    return 0;}


0 0