1. 程式人生 > >洛谷P3803 【模板】多項式乘法(FFT) 【fft】

洛谷P3803 【模板】多項式乘法(FFT) 【fft】

n+1 swap 提示 接下來 bug ret const define %d

題目

這是一道FFT模板題

輸入格式

給定一個n次多項式F(x),和一個m次多項式G(x)。

請求出F(x)和G(x)的卷積。

輸出格式

第一行2個正整數n,m。

接下來一行n+1個數字,從低到高表示F(x)的系數。

接下來一行m+1個數字,從低到高表示G(x))的系數。

輸入樣例

一行n+m+1個數字,從低到高表示F(x)?G(x)的系數。

輸出樣例

1 2
1 2
1 2 1

提示

1 4 5 2

題解

表示叠代還不是很懂
只好背模板。。。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<complex> #include<algorithm> #define pi acos(-1) #define LL long long int #define REP(i,n) for (int i = 1; i <= (n); i++) #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<‘ ‘; puts(""); using namespace
std; const int maxn = 3000005,maxm = 100005,INF = 1000000000; inline int read(){ int out = 0,flag = 1; char c = getchar(); while (c < 48 || c > 57) {if (c == ‘-‘) flag = -1; c = getchar();} while (c >= 48 && c <= 57) {out = (out << 3) + (out << 1) + c - ‘0‘; c = getchar();} return
out * flag; } typedef complex<double> E; E A[maxn],B[maxn]; int N,M,n,m,L,R[maxn]; void fft(E* a,int f){ for (int i = 0; i < n; i++) if (i < R[i]) swap(a[i],a[R[i]]); for (int i = 1; i < n; i <<= 1){ E wn(cos(pi / i),f * sin(pi / i)); for (int j = 0; j < n; j+= (i << 1)){ E w(1,0); for (int k = 0; k < i; k++,w *= wn){ E x = a[j + k],y = w * a[j + k + i]; a[j + k] = x + y; a[j + k + i] = x - y; } } } if (f == -1) for (int i = 0; i < n; i++) a[i] /= n; } int main(){ N = read(); M = read(); for (int i = 0; i <= N; i++) A[i] = read(); for (int i = 0; i <= M; i++) B[i] = read(); m = N + M; for (n = 1; n <= m; n <<= 1) L++; for (int i = 0; i < n; i++) R[i] = (R[i >> 1] >> 1) | ((i & 1) << (L - 1)); fft(A,1); fft(B,1); for (int i = 0; i <= n; i++) A[i] *= B[i]; fft(A,-1); for (int i = 0; i <= m; i++) printf("%d ",(int)(A[i].real() + 0.1)); return 0; }

洛谷P3803 【模板】多項式乘法(FFT) 【fft】