HDU1402 FFT高精度乘法模板题

摘要:
#包括 使用namespacestd;组成N=50005*4;常量双PI=acos(-1);typedefcomplex<double>cp;charsa[N],sb[N];intn=1,lena,lenb,res[N];cpa[N],b[N],DFT[N],IDFT[N];voinitit(){对于{DFT[i]=cp;IDFT[i]=conj;}}无效fft{int lim=0;while lim++;for{int t=0;f if |=;if(i<t)swap;//i<t的限制使得每对点只能交换一次},用于{int m=l/2;for(cp*p=a;p!
#include<bits/stdc++.h>
using namespace std;
const int N = 50005*4;
const double PI = acos(-1);
typedef complex <double> cp;
char sa[N], sb[N];
int n = 1, lena, lenb, res[N];
cp a[N], b[N], DFT[N], IDFT[N];
void init()
{
    for(int i = 0; i < n; i++)
    {
        DFT[i] = cp(cos(2 * PI * i / n), sin(2 * PI * i / n));
        IDFT[i] = conj(DFT[i]);
    }
}
void fft(cp *a, cp *wn)
{
    int lim = 0;
    while((1 << lim) < n) lim++;
    for(int i = 0; i < n; i++)
    {
        int t = 0;
        for(int j = 0; j < lim; j++)
            if((i >> j) & 1) t |= (1 << (lim - j - 1));
        if(i < t) swap(a[i], a[t]); // i < t 的限制使得每对点只被交换一次(否则交换两次相当于没交换)
    }
    for(int l = 2; l <= n; l *= 2)
    {
        int m = l / 2;
        for(cp *p = a; p != a + n; p += l)
            for(int i = 0; i < m; i++)
            {
                cp t = wn[n / l * i] * p[i + m];
                p[i + m] = p[i] - t;
                p[i] += t;
            }
    }
}
int main()
{

    while(scanf("%s%s",sa,sb)==2)
    {
        n=1;
        memset(res,0,sizeof(res));
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        lena = strlen(sa), lenb = strlen(sb);
        while(n < lena + lenb) n *= 2;
        for(int i = 0; i < lena; i++)
            a[i].real(sa[lena-1-i]-'0');
        for(int i = 0; i < lenb; i++)
            b[i].real(sb[lenb - 1 - i] - '0');
        init();
//求DFT
        fft(a,DFT);
        fft(b,DFT);
        for(int i = 0; i < n; i++)
            a[i] = a[i]*b[i];
//求IDFT
        fft(a,IDFT);

        for(int i = 0; i < n; i++)
        {
            res[i] += (int)(a[i].real() / n + 0.5);
            res[i + 1] += res[i] / 10;
            res[i] %= 10;
        }
        n = lena+lenb-1;
        while(res[n] <= 0 && n > 0)n--;
        for(int i = n; i >= 0; i--)
            printf("%c",res[i]+'0');
        printf("
");
    }
    return 0;
}

 参考自https://www.cnblogs.com/RabbitHu/p/FFT.html

免责声明:文章转载自《HDU1402 FFT高精度乘法模板题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇[转]如何定位Release程序崩溃原因Spring RestTemplate简介及使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

php中浮点数计算问题

最近做一个关于价格的程序时,碰到了一个很奇怪的问题。我把问题给抓出来了。请看如下代码: <?php$a = 86.1 - 80.0;echo 6.1 - $a;?>   你会发现,echo出来的结果居然不是0,而是5.3290705182E-15。思索了半天,也没找到是什么原因。用了C语言试了一下,结果正常。同事说他以前也遇到过,估计是超出了P...

OpenCV-Python 傅里叶变换 | 三十

目标 在本节中,我们将学习 使用OpenCV查找图像的傅立叶变换 利用Numpy中可用的FFT函数 傅立叶变换的某些应用程序 我们将看到以下函数:cv.dft(),cv.idft()等 理论 傅立叶变换用于分析各种滤波器的频率特性。对于图像,使用2D离散傅里叶变换(DFT)查找频域。一种称为快速傅立叶变换(FFT)的快速算法用于DFT的计算。关于这...

[转载]功率谱

原文地址:功率谱作者:wangjiufa1987 求信号功率谱时候用下面的不同方法,功率谱密度的幅值大小相差很大!我的问题是,计算具体信号时,到底应该以什么准则决定该选用什么方法啊?功率谱密度的幅植的具体意义是什么??下面是一些不同方法计算同一信号的matlab程序!欢迎大家给点建议! 直接法:直接法又称周期图法,它是把随机序列x(n)的N个观...

android音乐柱状频谱实现

原文地址:http://blog.csdn.net/caryee89/article/details/6935237 注意android2.3以后才可用,主要用到这个类Visualizer,这个源码其实是apiDemos中一个例子,但例子中实现的是两种中的波形显示,而不是频谱显示, 原文博主实现了另一种频谱显示,并分享出来,精神可嘉。我做了些修改,使稍微...

多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/例题与常用套路【入门】 前置技能 对复数以及复平面有一定的了解 对数论要求了解:逆元,原根,中国剩余定理 对分治有充足的认识 对多项式有一定的认识,并会写...

STM32使用FFT变换计算THD(20年四川省电子设计大赛E题软件部分)

注: 本篇内容意在使不理解FFT变换的读者也可以通过使用FFT来计算总谐波失真 FFT变换 根据总谐波失真的定义: [THD = frac{sqrt{sum_{n=0}^{infty}{G_{n}^{2}}}}{G_0} (G_0为基波,G_n 为高次谐波) ] 可知,要计算THD需要知道基波分量和各个谐波分量的大小。 ​ FFT也叫快速傅里叶变换,是离散...