傅里叶大数相乘算法HDU A * B Problem Plus

HDU A * B Problem Plus

这道题需要利用傅里叶变换的卷积性质:对于两个离散的序列求卷积的过程事实上就是一个求不进位乘法的过程,傅里叶变换的卷积性质告诉我们,两个离散序列的卷积运算经一个离散傅里叶变换(DFT)后,就变成了这两个序列对应每个位上面的乘法。快速傅里叶变换(FFT)就是DFT的一个O(nlogn)的快速算法,因此两个长乘法可以经FFT简化至O(nlogn)的时间级了。

 

#include 
#include
#include
#include
#include
#define Maxn 200000
#define PI 3.141592653
typedef struct Virt {
double r;
    double i;
}Virt;
Virt bitRevTemp[2*Maxn];
Virt va[Maxn*2],vb[2*Maxn];
int ans[Maxn*2];
Virt Virt_Add(Virt a,Virt b)
{
    Virt t;
    t.r = a.r+b.r;
    t.i = a.i+b.i;
    return t;
}
Virt Virt_Sub(Virt a,Virt b)
{
    Virt t;
    t.r = a.r-b.r;
    t.i = a.i-b.i;
    return t;
}
Virt Virt_Multi(Virt a,Virt b)
{
    Virt t;
    t.r = a.r*b.r - a.i*b.i;
    t.i = a.r*b.i + a.i*b.r;
    return t;
}
int rev(int x,int l)   //位反置:将长度l的那几位倒过来就是
{
    int i,sum;
    sum=0;
    while (l--) {
        sum |= (x&1);
        x>>=1;
        sum<<=1;
    }
    sum>>=1;
   return sum;
}
void bitRevCpy(Virt *a,int len)
{
    int k,bits,t;
    t = 1;
    bits = 0;
    while (t0; top--);
        top+=1;
        while (top-- >= 1)
            printf("%d",ans[top]);
        printf("\n");
    }
    return 0;
}


 

你可能感兴趣的:(others)