/*
* [Ctsc2010]性能优化.cpp
*
* Created on: 2011-4-19
* Author: user
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <climits>
#include <cstring>
#include <vector>
#define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e)
using namespace std;
typedef long long int64;
int64 doPowMod(int64 x, int64 e, int64 mod) {
if (!e)
return 1;
if (e & 1)
return doPowMod(x, e - 1, mod) * x % mod;
return doPowMod(x * x % mod, e >> 1, mod);
}
int64 invMod(int64 x, int64 mod) {
return doPowMod(x, mod - 2, mod);
}
int64 powMod(int64 x, int64 e, int64 mod) {
if (e >= 0)
return doPowMod(x, e, mod);
int64 tmp = powMod(x, -e, mod);
return invMod(tmp, mod);
}
int n, C;
const int MAX_N = 1000000;
int64 a[MAX_N], b[MAX_N];
const int PRIMES[] = { 2, 3, 5, 7 };
void readInput() {
cin >> n >> C;
for (int i = 0; i < n; ++i) {
int x;
scanf("%d", &x);
a[i] = x % (n + 1);
}
for (int i = 0; i < n; ++i) {
int x;
scanf("%d", &x);
b[i] = x % (n + 1);
}
if (C != 0) {
C %= n;
if (C == 0)
C = n;
}
}
bool ispRoot(int me) {
for (int t = 0; t < 4; ++t) {
int x = PRIMES[t];
if (n % x != 0)
continue;
if (powMod(me, n / x, n + 1) == 1)
return false;
}
return true;
}
int g;
void getpRoot() {
for (int i = 2; i <= n; ++i) {
if (ispRoot(i)) {
g = i;
break;
}
}
// cerr << g << endl;
}
void DFT(int64 a[], int s, int rev) {
if (s == 1)
return;
int d;
for (int i = 0; i < 4; ++i) {
if (s % PRIMES[i] == 0) {
d = PRIMES[i];
break;
}
}
static int64 tmp[MAX_N];
memcpy(tmp, a, sizeof(int64) * s);
int64*ch[10];
int chS = s / d;
int64*cur = a;
for (int i = 0; i < d; ++i) {
ch[i] = cur;
cur += chS;
}
for (int i = 0; i < s; ++i) {
ch[i % d][i / d] = tmp[i];
}
for (int i = 0; i < d; ++i) {
DFT(ch[i], chS, rev);
}
int64 step = powMod(g, rev * n / s, n + 1);
int64 w = 1;
for (int i = 0; i < s; ++i) {
int64 p = 1;
tmp[i] = 0;
for (int j = 0; j < d; ++j) {
(tmp[i] += ch[j][i % (chS)] * p) %= n + 1;
(p *= w) %= n + 1;
}
(w *= step) %= n + 1;
}
memcpy(a, tmp, sizeof(int64) * s);
}
void bfWork() {
vector<int64> x(a, a + n);
for (int iter = 0; iter < C; ++iter) {
vector<int64> y(n, 0);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
(y[(i + j) % n] += x[i] * b[j]) %= n + 1;
}
}
x = y;
}
cout << "Ans:" << endl;
for (int i = 0; i < n; ++i) {
cout << x[i] << endl;
}
cout << "End" << endl;
}
void work() {
getpRoot();
DFT(a, n, 1);
// for (int i = 0; i < n; ++i) {
// cout << a[i] << endl;
// }
DFT(b, n, 1);
for (int i = 0; i < n; ++i) {
(a[i] *= powMod(b[i], C, n + 1)) %= n + 1;
}
DFT(a, n, -1);
for (int i = 0; i < n; ++i) {
(a[i] *= invMod(n, n + 1)) %= n + 1;
}
for (int i = 0; i < n; ++i) {
printf("%d\n", (int) a[i]);
}
}
void genData() {
n = 2 * 3 * 5;
C = rand() % 1000;
for (int i = 0; i < n; ++i) {
a[i] = rand() % (n + 1);
b[i] = rand() % (n + 1);
}
}
void solve() {
readInput();
// bfWork();
work();
}
int main() {
solve();
// genData();
// bfWork();
// work();
}
LyoKICogIFtDdHNjMjAxMF3mgKfog73kvJjljJYuY3BwCiAqCiAqICBDcmVhdGVkIG9uOiAyMDExLTQtMTkKICogICAgICBBdXRob3I6IHVzZXIKICovCgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxjbGltaXRzPgojaW5jbHVkZSA8Y3N0cmluZz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2RlZmluZSBmb3JlYWNoKGUseCkgZm9yKF9fdHlwZW9mKHguYmVnaW4oKSkgZT14LmJlZ2luKCk7ZSE9eC5lbmQoKTsrK2UpCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NDsKaW50NjQgZG9Qb3dNb2QoaW50NjQgeCwgaW50NjQgZSwgaW50NjQgbW9kKSB7CglpZiAoIWUpCgkJcmV0dXJuIDE7CglpZiAoZSAmIDEpCgkJcmV0dXJuIGRvUG93TW9kKHgsIGUgLSAxLCBtb2QpICogeCAlIG1vZDsKCXJldHVybiBkb1Bvd01vZCh4ICogeCAlIG1vZCwgZSA+PiAxLCBtb2QpOwp9CgppbnQ2NCBpbnZNb2QoaW50NjQgeCwgaW50NjQgbW9kKSB7CglyZXR1cm4gZG9Qb3dNb2QoeCwgbW9kIC0gMiwgbW9kKTsKfQoKaW50NjQgcG93TW9kKGludDY0IHgsIGludDY0IGUsIGludDY0IG1vZCkgewoJaWYgKGUgPj0gMCkKCQlyZXR1cm4gZG9Qb3dNb2QoeCwgZSwgbW9kKTsKCWludDY0IHRtcCA9IHBvd01vZCh4LCAtZSwgbW9kKTsKCXJldHVybiBpbnZNb2QodG1wLCBtb2QpOwp9CgppbnQgbiwgQzsKY29uc3QgaW50IE1BWF9OID0gMTAwMDAwMDsKaW50NjQgYVtNQVhfTl0sIGJbTUFYX05dOwoKY29uc3QgaW50IFBSSU1FU1tdID0geyAyLCAzLCA1LCA3IH07Cgp2b2lkIHJlYWRJbnB1dCgpIHsKCWNpbiA+PiBuID4+IEM7Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCWludCB4OwoJCXNjYW5mKCIlZCIsICZ4KTsKCQlhW2ldID0geCAlIChuICsgMSk7Cgl9Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCWludCB4OwoJCXNjYW5mKCIlZCIsICZ4KTsKCQliW2ldID0geCAlIChuICsgMSk7Cgl9CgoJaWYgKEMgIT0gMCkgewoJCUMgJT0gbjsKCQlpZiAoQyA9PSAwKQoJCQlDID0gbjsKCX0KfQoKYm9vbCBpc3BSb290KGludCBtZSkgewoJZm9yIChpbnQgdCA9IDA7IHQgPCA0OyArK3QpIHsKCQlpbnQgeCA9IFBSSU1FU1t0XTsKCQlpZiAobiAlIHggIT0gMCkKCQkJY29udGludWU7CgkJaWYgKHBvd01vZChtZSwgbiAvIHgsIG4gKyAxKSA9PSAxKQoJCQlyZXR1cm4gZmFsc2U7Cgl9CglyZXR1cm4gdHJ1ZTsKfQoKaW50IGc7Cgp2b2lkIGdldHBSb290KCkgewoJZm9yIChpbnQgaSA9IDI7IGkgPD0gbjsgKytpKSB7CgkJaWYgKGlzcFJvb3QoaSkpIHsKCQkJZyA9IGk7CgkJCWJyZWFrOwoJCX0KCX0KCS8vCWNlcnIgPDwgZyA8PCBlbmRsOwp9Cgp2b2lkIERGVChpbnQ2NCBhW10sIGludCBzLCBpbnQgcmV2KSB7CglpZiAocyA9PSAxKQoJCXJldHVybjsKCWludCBkOwoJZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKCQlpZiAocyAlIFBSSU1FU1tpXSA9PSAwKSB7CgkJCWQgPSBQUklNRVNbaV07CgkJCWJyZWFrOwoJCX0KCX0KCglzdGF0aWMgaW50NjQgdG1wW01BWF9OXTsKCW1lbWNweSh0bXAsIGEsIHNpemVvZihpbnQ2NCkgKiBzKTsKCglpbnQ2NCpjaFsxMF07CgoJaW50IGNoUyA9IHMgLyBkOwoJaW50NjQqY3VyID0gYTsKCWZvciAoaW50IGkgPSAwOyBpIDwgZDsgKytpKSB7CgkJY2hbaV0gPSBjdXI7CgkJY3VyICs9IGNoUzsKCX0KCglmb3IgKGludCBpID0gMDsgaSA8IHM7ICsraSkgewoJCWNoW2kgJSBkXVtpIC8gZF0gPSB0bXBbaV07Cgl9CgoJZm9yIChpbnQgaSA9IDA7IGkgPCBkOyArK2kpIHsKCQlERlQoY2hbaV0sIGNoUywgcmV2KTsKCX0KCglpbnQ2NCBzdGVwID0gcG93TW9kKGcsIHJldiAqIG4gLyBzLCBuICsgMSk7CglpbnQ2NCB3ID0gMTsKCWZvciAoaW50IGkgPSAwOyBpIDwgczsgKytpKSB7CgkJaW50NjQgcCA9IDE7CgkJdG1wW2ldID0gMDsKCQlmb3IgKGludCBqID0gMDsgaiA8IGQ7ICsraikgewoJCQkodG1wW2ldICs9IGNoW2pdW2kgJSAoY2hTKV0gKiBwKSAlPSBuICsgMTsKCQkJKHAgKj0gdykgJT0gbiArIDE7CgkJfQoJCSh3ICo9IHN0ZXApICU9IG4gKyAxOwoJfQoJbWVtY3B5KGEsIHRtcCwgc2l6ZW9mKGludDY0KSAqIHMpOwp9Cgp2b2lkIGJmV29yaygpIHsKCXZlY3RvcjxpbnQ2ND4geChhLCBhICsgbik7Cglmb3IgKGludCBpdGVyID0gMDsgaXRlciA8IEM7ICsraXRlcikgewoJCXZlY3RvcjxpbnQ2ND4geShuLCAwKTsKCQlmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCQlmb3IgKGludCBqID0gMDsgaiA8IG47ICsraikgewoJCQkJKHlbKGkgKyBqKSAlIG5dICs9IHhbaV0gKiBiW2pdKSAlPSBuICsgMTsKCQkJfQoJCX0KCQl4ID0geTsKCX0KCgljb3V0IDw8ICJBbnM6IiA8PCBlbmRsOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKCQljb3V0IDw8IHhbaV0gPDwgZW5kbDsKCX0KCWNvdXQgPDwgIkVuZCIgPDwgZW5kbDsKfQoKdm9pZCB3b3JrKCkgewoJZ2V0cFJvb3QoKTsKCglERlQoYSwgbiwgMSk7CgoJLy8JZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKCS8vCQljb3V0IDw8IGFbaV0gPDwgZW5kbDsKCS8vCX0KCglERlQoYiwgbiwgMSk7Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCShhW2ldICo9IHBvd01vZChiW2ldLCBDLCBuICsgMSkpICU9IG4gKyAxOwoJfQoJREZUKGEsIG4sIC0xKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CgkJKGFbaV0gKj0gaW52TW9kKG4sIG4gKyAxKSkgJT0gbiArIDE7Cgl9Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCXByaW50ZigiJWRcbiIsIChpbnQpIGFbaV0pOwoJfQp9Cgp2b2lkIGdlbkRhdGEoKSB7CgluID0gMiAqIDMgKiA1OwoJQyA9IHJhbmQoKSAlIDEwMDA7Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCWFbaV0gPSByYW5kKCkgJSAobiArIDEpOwoJCWJbaV0gPSByYW5kKCkgJSAobiArIDEpOwoJfQp9Cgp2b2lkIHNvbHZlKCkgewoJcmVhZElucHV0KCk7CgkvLwliZldvcmsoKTsKCXdvcmsoKTsKfQoKaW50IG1haW4oKSB7Cglzb2x2ZSgpOwoJLy8JZ2VuRGF0YSgpOwoJLy8JYmZXb3JrKCk7CgkvLwl3b3JrKCk7Cn0K