int swp[MAXN + 10]; voidEvaSwp(int n){ int mxdeg = n >> 1; for (int i = 1; i < n; ++i) { swp[i] = (swp[i >> 1] >> 1) + ((i & 1) ? mxdeg : 0); } } voidSwp(int n, int *a){ for (int i = 0; i < n; ++i) { if (swp[i] > i) { swap(a[i], a[swp[i]]); } } } voidNTT(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; } } }