UOJ#34 FFT模板題

寫完上一道題才意識到自己沒有在博客裏丟過FFT的模板……
這道題就是裸的多項式乘法,可以FFT,可以NTT,也可以用Karasuba(好像有人這麼寫沒有T),也可以各種其他分治乘法亂搞……
所以我就直接給板子了

#include <cstdio>
#include <cmath>
#define MAXN 300005
#define DB double
#define pi 3.14159265358
struct cp {
    DB x, y;
    cp(){} cp(DB a, DB b):x(a), y(b){}
    cp operator + (const cp &r) const { return cp(x+r.x, y+r.y); }
    cp operator - (const cp &r) const { return cp(x-r.x, y-r.y); }
    cp operator * (const cp &r) const { return cp(x*r.x - y*r.y, x*r.y+y*r.x); }
} a[MAXN], b[MAXN], tmp;
inline void Swap(cp &a, cp &b) { tmp=a; a=b; b=tmp; }
int n, m;
inline void fft(cp *a, int f) {
    for(int i = 0, j = 0; i < n; ++ i) {
        if(i > j) Swap(a[i], a[j]);
        for(int l = (n>>1); (j^=l) < l; l >>= 1);
    }
    for(int i = 1; i < n; i <<= 1) {
        cp wn(cos(pi/i), f*sin(pi/i));
        for(int j = 0; j < n; j += i<<1) {
            cp w(1, 0);
            for(int k = 0; k < i; ++ k, w = w * wn) {
                cp x = a[j + k], y = w * a[j + k + i];
                a[j + k] = x + y;
                a[j + k + i] = x - y;
            }
        }
    }
    if(-1 == f) for(int i = 0; i < n; ++ i) a[i].x /= n;
}
int main() {
    scanf("%d%d", &n, &m);
    for(int i = 0; i <= n; ++ i) scanf("%lf", &a[i].x);
    for(int i = 0; i <= m; ++ i) scanf("%lf", &b[i].x);
    for(m = n+m, n = 1; n <= m; n <<= 1);
    fft(a, 1); fft(b, 1);
    for(int i = 0; i <= n; ++ i) a[i] = a[i] * b[i];
    fft(a, -1);
    for(int i = 0; i <= m; ++ i) printf("%d ", (int)(a[i].x+0.1));
}
發佈了116 篇原創文章 · 獲贊 24 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章