FFT模板

来源:互联网 发布:dos复制文件到linux 编辑:程序博客网 时间:2024/05/18 17:01
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define N 50002#define eps 0.5const 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& t) const { return Complex(r + t.r, i + t.i); }    Complex operator - (const Complex& t) const { return Complex(r - t.r, i - t.i); }    Complex operator * (const Complex& t) const { return Complex(r * t.r - i * t.i, r * t.i + i * t.r); }}A[N<<2], B[N<<2];void FFT(Complex y[], int n, int rev)//rev == 1时为DFT,rev == -1时为IDFT{    for (int i = 1, j, k, t; i < n; ++i)    {        for (j = 0, k = n >> 1, t = i; k; k >>= 1, t >>= 1) j = j << 1 | t & 1;        if (i < j) swap(y[i], y[j]);    }    for (int s = 2, ds = 1; s <= n; ds = s, s <<= 1)    {        Complex wn(cos(rev * 2 * PI / s), sin(rev * 2 * PI / s));        for (int k = 0; k < n; k += s)        {            Complex w(1, 0), t;            for (int i = k; i < k + ds; ++i)            {                y[i + ds] = y[i] - (t = w * y[i + ds]);                y[i] = y[i] + t;                w = w * wn;            }        }    }    if (rev == -1) for (int i = 0; i < n; ++i) y[i].r /= n;}char a[N], b[N];int ans[N<<2];int main() {    int len1, len2, i;    while (gets(a)) {        gets(b);        len1 = strlen(a), len2 = strlen(b);        for (i = len1-1;i >= 0;i--) {            A[len1-1-i] = {(a[i]-'0')*1.0, 0};        }        for (i = len2-1;i >= 0;i--) {            B[len2-1-i] = {(b[i]-'0')*1.0, 0};        }        int len = 1;        while (len < len1+len2) len <<= 1;        for (i = len1;i < len;i++) A[i] = {0,0};        for (i = len2;i < len;i++) B[i] = {0,0};        FFT(A, len, 1);        FFT(B, len, 1);        for (i = 0;i < len;i++) B[i] = A[i]*B[i];        FFT(B, len, -1);        for (i = 0;i < len;i++) ans[i] = (int)(B[i].r+eps);        for (i = 0;i < len;i++ ) {            ans[i+1] += ans[i]/10;            ans[i] %= 10;        }        for (i = len-1;i >= 0;i--) {            if (ans[i] != 0) break;        }        if (i < 0) puts("0");        else {            for (i;i >= 0;i--) printf("%d", ans[i]);            puts("");        }    }}

0 0
原创粉丝点击