summaryrefslogtreecommitdiff
path: root/content/math/transforms/ntt.cpp
blob: ca605d31b277caf5f2bc0372fc075213173369f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
constexpr ll mod = 998244353, root = 3;

void ntt(vector<ll>& a, bool inv = false) {
	int n = sz(a);
	auto b = a;
	ll r = inv ? powMod(root, mod - 2, mod) : root;

	for (int s = n / 2; s > 0; s /= 2) {
		ll ws = powMod(r, (mod - 1) / (n / s), mod), w = 1;
		for (int j = 0; j < n / 2; j += s) {
			for (int k = j; k < j + s; k++) {
				ll u = a[j + k], t = a[j + s + k] * w % mod;
				b[k] = (u + t) % mod;
				b[n/2 + k] = (u - t + mod) % mod;
			}
			w = w * ws % mod;
		}
		swap(a, b);
	}
	if (inv) {
		ll div = powMod(n, mod - 2, mod);
		for (auto& x : a) x = x * div % mod;
}}