代码:
```cpp
// luogu-judger-enable-o2
#include <iostream>
#include <algorithm>
const int N = 500000;
using LL = long long;
int n, m, wn[N], primes[N], power[N], prime_tot, mod;
int pow(int x, int y) {
int ans = 1;
for (; y; y >>= 1, x = (LL) x * x % mod)
if (y & 1) ans = (LL) ans * x % mod;
return ans;
}
void reduce(int &x) {
x += x >> 31 & mod;
}
void factor(int n) {
for (int i = 2; i * i <= n; ++i)
if (n % i == 0) n /= i, primes[prime_tot++] = i--;
if (n > 1) primes[prime_tot++] = n;
}
int primitive_root() {
for (int i = 2; ; ++i) {
bool flag = 1;
for (int j = 0; j < prime_tot; ++j)
if (pow(i, n / primes[j]) == 1) {
flag = 0; break;
}
if (flag) return i;
}
}
int tmp[N];
void reverse(int *A) {
for (int i = prime_tot - 1, block = n; ~i; --i) {
for (int idx = 0, k = 0; k < n; k += block)
for (int j = 0; j < primes[i]; ++j)
for (int l = 0; l < block; l += primes[i])
tmp[idx++] = A[k + j + l];
for (int k = 0; k < n; ++k) A[k] = tmp[k];
block /= primes[i];
}
}
void dft(int *A, int typ) {
reverse(A);
for (int i = 0, block = 1; i < prime_tot; ++i) {
const int mid = block, wi = wn[n / (block *= primes[i])];
for (int j = 0; j < n; ++j)
tmp[j] = 0;
for (int j = 0; j < n; j += block) {
int wk = 1;
for (int k = 0; k < block; ++k) {
for (int l = k % mid, w = 1; l < block; l += mid, w = (LL) w * wk % mod)
reduce(tmp[j + k] += (LL) w * A[j + l] % mod - mod);
wk = (LL) wk * wi % mod;
}
}
for (int j = 0; j < n; ++j)
A[j] = tmp[j];
}
if (!typ) {
std::reverse(A + 1, A + n);
for (int i = 0; i < n; ++i)
A[i] = (LL) A[i] * n % mod;
}
}
int a[N], b[N], rk[N];
int main() {
std::ios::sync_with_stdio(0), std::cin.tie(0);
std::cin >> n >> m, mod = n + 1, factor(n);
wn[0] = 1, wn[1] = primitive_root();
for (int i = 2; i < n; ++i) wn[i] = (LL) wn[i - 1] * wn[1] % mod;
for (int i = 0; i < n; ++i) std::cin >> a[i];
for (int i = 0; i < n; ++i) std::cin >> b[i];
dft(a, 1), dft(b, 1);
for (int i = 0; i < n; ++i)
a[i] = (LL) a[i] * pow(b[i], m) % mod;
dft(a, 0);
for (int i = 0; i < n; ++i)
std::cout << a[i] << '\n';
return 0;
}
```