1
1
/* *
2
2
* @file 108-NTT.cpp
3
3
* @author Macesuted ([email protected] )
4
- * @date 2022-05-01
4
+ * @date 2023-03-29
5
5
*
6
- * @copyright Copyright (c) 2022
6
+ * @copyright Copyright (c) 2023
7
7
*
8
8
*/
9
9
10
10
#include < bits/stdc++.h>
11
11
using namespace std ;
12
12
13
+ #ifndef LOCAL
14
+ #define endl ' \n '
15
+ #endif
16
+
13
17
bool mem1;
14
18
15
19
#define maxn 400005
@@ -30,20 +34,23 @@ const int64_t inv3 = Inv(3);
30
34
int64_t a[maxn], b[maxn];
31
35
int rev[maxn];
32
36
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++)
35
41
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));
43
50
}
44
51
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;
47
54
}
48
55
return ;
49
56
}
@@ -67,7 +74,7 @@ void solve(void) {
67
74
bool mem2;
68
75
69
76
int main () {
70
- ios::sync_with_stdio (false );
77
+ ios::sync_with_stdio (false ), cin. tie ( nullptr ) ;
71
78
#ifdef LOCAL
72
79
cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
73
80
#endif
0 commit comments