Skip to content

Commit 26f1763

Browse files
committed
LibreOJ: 108 (NTT) Optimize
多项式乘法
1 parent 1889f8b commit 26f1763

File tree

1 file changed

+21
-14
lines changed

1 file changed

+21
-14
lines changed

LibreOJ/108-NTT.cpp

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
/**
22
* @file 108-NTT.cpp
33
* @author Macesuted ([email protected])
4-
* @date 2022-05-01
4+
* @date 2023-03-29
55
*
6-
* @copyright Copyright (c) 2022
6+
* @copyright Copyright (c) 2023
77
*
88
*/
99

1010
#include <bits/stdc++.h>
1111
using namespace std;
1212

13+
#ifndef LOCAL
14+
#define endl '\n'
15+
#endif
16+
1317
bool mem1;
1418

1519
#define maxn 400005
@@ -30,20 +34,23 @@ const int64_t inv3 = Inv(3);
3034
int64_t a[maxn], b[maxn];
3135
int rev[maxn];
3236

33-
void DFT(int64_t a[], int len, int mode) {
34-
for (int i = 0; i < len; i++)
37+
int Mod(int x) { return x >= mod ? x - mod : x; }
38+
39+
void DFT(int64_t a[], int n, int mode) {
40+
for (int i = 0; i < n; i++)
3541
if (i < rev[i]) swap(a[i], a[rev[i]]);
36-
for (int i = 1; i < len; i <<= 1) {
37-
int64_t base = Pow(mode == 1 ? 3 : inv3, (mod - 1) / (i << 1));
38-
for (int j = 0; j < len; j += i << 1) {
39-
int64_t w = 1;
40-
for (int k = j; k < j + i; k++, w = w * base % mod)
41-
tie(a[k], a[k + i]) = make_pair((a[k] + w * a[k + i]) % mod, (a[k] + mod - w * a[k + i] % mod) % mod);
42-
}
42+
for (int i = 1; i < n; i <<= 1) {
43+
int64_t w[i];
44+
w[0] = 1, w[1] = Pow(mode == +1 ? 3 : inv3, mod / (i << 1));
45+
for (int j = 2; j < i; j++) w[j] = w[j - 1] * w[1] % mod;
46+
for (int j = 0; j < n; j += i << 1)
47+
for (int k = j; k < j + i; k++)
48+
tie(a[k], a[k + i]) =
49+
make_pair((a[k] + w[k - j] * a[k + i]) % mod, Mod((a[k] - w[k - j] * a[k + i]) % mod + mod));
4350
}
4451
if (mode == -1) {
45-
int64_t invLen = Inv(len);
46-
for (int i = 0; i < len; i++) a[i] = a[i] * invLen % mod;
52+
int64_t invn = Inv(n);
53+
for (int i = 0; i < n; i++) a[i] = a[i] * invn % mod;
4754
}
4855
return;
4956
}
@@ -67,7 +74,7 @@ void solve(void) {
6774
bool mem2;
6875

6976
int main() {
70-
ios::sync_with_stdio(false);
77+
ios::sync_with_stdio(false), cin.tie(nullptr);
7178
#ifdef LOCAL
7279
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
7380
#endif

0 commit comments

Comments
 (0)