Luogu P3803 【模板】多项式乘法(FFT)

代码中的变量 n 的意义是多项式的长度,也就是度数加一,而非度数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const int MOD = 998244353, G = 3;

int swp[MAXN + 10];
void EvaSwp(int n) {
int mxdeg = n >> 1;
for (int i = 1; i < n; ++i) {
swp[i] = (swp[i >> 1] >> 1) + ((i & 1) ? mxdeg : 0);
}
}
void Swp(int n, int *a) {
for (int i = 0; i < n; ++i) {
if (swp[i] > i) {
swap(a[i], a[swp[i]]);
}
}
}
void NTT(int n, int *a, int getinv) {
Swp(n, a);
for (int len = 2, halflen = 1; len <= n; len <<= 1, halflen <<= 1) {
int glen = power(G, (MOD - 1) / len);
for (int l = 0, r = len - 1; r < n; l += len, r += len) {
int g = 1;
for (int i = l, j = l + halflen; j <= r; ++i, ++j, g = g * glen % MOD) {
int u = a[i],
v = a[j] * g % MOD;
a[i] = addmod(u + v);
a[j] = redmod(u - v);
}
}
}
if (getinv == -1) {
reverse(a + 1, a + n);
int invn = inv(n);
for (int i = 0; i < n; ++i) {
a[i] = a[i] * invn % MOD;
}
}
}