#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
struct matrix {
int rows, cols;
long *array;
};
long& m_el(const matrix& m, int row, int col)
{
return m.array[m.cols * row + col];
}
void m_init(matrix& m, int rows, int cols)
{
m.rows = rows;
m.cols = cols;
m.array = (long*)malloc(sizeof(long) * rows * cols);
}
void m_copy(matrix& dest, matrix& src)
{
int i;
for (i = 0; i < src.rows * src.cols; ++i)
dest.array[i] = src.array[i];
}
matrix *m_genn(int n)
{
int x, y;
matrix *m = (matrix*)malloc(sizeof(matrix));
m_init(*m, n, n);
for (y = 0; y < n; ++y) {
for (x = 0; x < n; ++x) {
if (x == y)
m_el(*m, y, x) = 1;
else
m_el(*m, y, x) = 0;
}
}
return m;
}
long m_mul_rc(matrix& src1, matrix& src2, int row, int col)
{
int i;
long sum = 0;
for (i = 0; i < src1.cols; ++i)
sum += m_el(src1, row, i) * m_el(src2, i, col);
return sum;
}
void m_mul(matrix& dest, matrix& src1, matrix& src2)
{
assert(src1.cols == src2.rows && src1.rows == dest.rows &&
src2.cols == dest.cols);
int x, y;
for (y = 0; y < dest.rows; ++y) {
for (x = 0; x < dest.cols; ++x)
m_el(dest, y, x) = m_mul_rc(src1, src2, y, x) % 100007;
}
}
matrix *m_pow(matrix& src, matrix& one, int pow)
{
if (pow == 0) {
matrix *res = (matrix*)malloc(sizeof(matrix));
m_init(*res, src.rows, src.cols);
m_copy(*res, one);
return res;
} else if (pow % 2 == 0) {
matrix *ir = m_pow(src, one, pow / 2);
matrix *r = (matrix*)malloc(sizeof(matrix));
m_init(*r, src.rows, src.cols);
m_mul(*r, *ir, *ir);
free(ir->array);
free(ir);
return r;
} else {
matrix *ir = m_pow(src, one, pow / 2);
matrix *r1 = (matrix*)malloc(sizeof(matrix));
matrix *r2 = (matrix*)malloc(sizeof(matrix));
m_init(*r1, src.rows, src.cols);
m_init(*r2, src.rows, src.cols);
m_mul(*r1, *ir, *ir);
m_mul(*r2, *r1, src);
free(ir->array);
free(ir);
free(r1->array);
free(r1);
return r2;
}
}
int main()
{
int i, tnum;
scanf("%d", &tnum);
for (i = 0; i < tnum; ++i) {
matrix ini, trs;
int n, m, j, k;
scanf("%d%d", &n, &m);
m_init(ini, n, 1);
m_init(trs, n, n);
for (j = 0; j < n; ++j) {
for (k = 0; k < n; ++k) {
int p;
scanf("%d", &p);
m_el(trs, j, k) = p;
}
}
for (j = 0; j < n; ++j) {
int p;
scanf("%d", &p);
m_el(ini, 0, j) = p;
}
matrix *nm = m_pow(trs, *m_genn(n), m);
matrix res;
m_init(res, n, 1);
m_mul(res, *nm, ini);
printf("Case #%d: ", i + 1);
for (j = 0; j < n; ++j)
printf("%ld%c", m_el(res, j, 0), j + 1 == n ? '\n' : ' ');
}
return 0;
}
I2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdGRpby5oPgogCnN0cnVjdCBtYXRyaXggewogICAgaW50IHJvd3MsIGNvbHM7CiAgICBsb25nICphcnJheTsKfTsKIApsb25nJiBtX2VsKGNvbnN0IG1hdHJpeCYgbSwgaW50IHJvdywgaW50IGNvbCkKewogICAgcmV0dXJuIG0uYXJyYXlbbS5jb2xzICogcm93ICsgY29sXTsKfQogCnZvaWQgbV9pbml0KG1hdHJpeCYgbSwgaW50IHJvd3MsIGludCBjb2xzKQp7CiAgICBtLnJvd3MgPSByb3dzOwogICAgbS5jb2xzID0gY29sczsKICAgIG0uYXJyYXkgPSAobG9uZyopbWFsbG9jKHNpemVvZihsb25nKSAqIHJvd3MgKiBjb2xzKTsKfQogCnZvaWQgbV9jb3B5KG1hdHJpeCYgZGVzdCwgbWF0cml4JiBzcmMpCnsKICAgIGludCBpOwogICAgZm9yIChpID0gMDsgaSA8IHNyYy5yb3dzICogc3JjLmNvbHM7ICsraSkKICAgICAgICBkZXN0LmFycmF5W2ldID0gc3JjLmFycmF5W2ldOwp9CiAKbWF0cml4ICptX2dlbm4oaW50IG4pCnsKICAgIGludCB4LCB5OwogICAgbWF0cml4ICptID0gKG1hdHJpeCopbWFsbG9jKHNpemVvZihtYXRyaXgpKTsKICAgIG1faW5pdCgqbSwgbiwgbik7CiAgICBmb3IgKHkgPSAwOyB5IDwgbjsgKyt5KSB7CiAgICAgICAgZm9yICh4ID0gMDsgeCA8IG47ICsreCkgewogICAgICAgICAgICBpZiAoeCA9PSB5KQogICAgICAgICAgICAgICAgbV9lbCgqbSwgeSwgeCkgPSAxOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBtX2VsKCptLCB5LCB4KSA9IDA7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG07Cn0KIApsb25nIG1fbXVsX3JjKG1hdHJpeCYgc3JjMSwgbWF0cml4JiBzcmMyLCBpbnQgcm93LCBpbnQgY29sKQp7CiAgICBpbnQgaTsKICAgIGxvbmcgc3VtID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCBzcmMxLmNvbHM7ICsraSkKICAgICAgICBzdW0gKz0gbV9lbChzcmMxLCByb3csIGkpICogbV9lbChzcmMyLCBpLCBjb2wpOwogICAgcmV0dXJuIHN1bTsKfQogCnZvaWQgbV9tdWwobWF0cml4JiBkZXN0LCBtYXRyaXgmIHNyYzEsIG1hdHJpeCYgc3JjMikKewogICAgYXNzZXJ0KHNyYzEuY29scyA9PSBzcmMyLnJvd3MgJiYgc3JjMS5yb3dzID09IGRlc3Qucm93cyAmJgogICAgICAgICAgICBzcmMyLmNvbHMgPT0gZGVzdC5jb2xzKTsKICAgIGludCB4LCB5OwogICAgZm9yICh5ID0gMDsgeSA8IGRlc3Qucm93czsgKyt5KSB7CiAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRlc3QuY29sczsgKyt4KQogICAgICAgICAgICBtX2VsKGRlc3QsIHksIHgpID0gbV9tdWxfcmMoc3JjMSwgc3JjMiwgeSwgeCkgJSAxMDAwMDc7CiAgICB9Cn0KIAptYXRyaXggKm1fcG93KG1hdHJpeCYgc3JjLCBtYXRyaXgmIG9uZSwgaW50IHBvdykKewogICAgaWYgKHBvdyA9PSAwKSB7CiAgICAgICAgbWF0cml4ICpyZXMgPSAobWF0cml4KiltYWxsb2Moc2l6ZW9mKG1hdHJpeCkpOwogICAgICAgIG1faW5pdCgqcmVzLCBzcmMucm93cywgc3JjLmNvbHMpOwogICAgICAgIG1fY29weSgqcmVzLCBvbmUpOwogICAgICAgIHJldHVybiByZXM7CiAgICB9IGVsc2UgaWYgKHBvdyAlIDIgPT0gMCkgewogICAgICAgIG1hdHJpeCAqaXIgPSBtX3BvdyhzcmMsIG9uZSwgcG93IC8gMik7CiAgICAgICAgbWF0cml4ICpyID0gKG1hdHJpeCopbWFsbG9jKHNpemVvZihtYXRyaXgpKTsKICAgICAgICBtX2luaXQoKnIsIHNyYy5yb3dzLCBzcmMuY29scyk7CiAgICAgICAgbV9tdWwoKnIsICppciwgKmlyKTsKICAgICAgICBmcmVlKGlyLT5hcnJheSk7CiAgICAgICAgZnJlZShpcik7CiAgICAgICAgcmV0dXJuIHI7CiAgICB9IGVsc2UgewogICAgICAgIG1hdHJpeCAqaXIgPSBtX3BvdyhzcmMsIG9uZSwgcG93IC8gMik7CiAgICAgICAgbWF0cml4ICpyMSA9IChtYXRyaXgqKW1hbGxvYyhzaXplb2YobWF0cml4KSk7CiAgICAgICAgbWF0cml4ICpyMiA9IChtYXRyaXgqKW1hbGxvYyhzaXplb2YobWF0cml4KSk7CiAgICAgICAgbV9pbml0KCpyMSwgc3JjLnJvd3MsIHNyYy5jb2xzKTsKICAgICAgICBtX2luaXQoKnIyLCBzcmMucm93cywgc3JjLmNvbHMpOwogCiAgICAgICAgbV9tdWwoKnIxLCAqaXIsICppcik7CiAgICAgICAgbV9tdWwoKnIyLCAqcjEsIHNyYyk7CiAgICAgICAgZnJlZShpci0+YXJyYXkpOwogICAgICAgIGZyZWUoaXIpOwogICAgICAgIGZyZWUocjEtPmFycmF5KTsKICAgICAgICBmcmVlKHIxKTsKICAgICAgICByZXR1cm4gcjI7CiAgICB9Cn0KIAppbnQgbWFpbigpCnsKICAgIGludCBpLCB0bnVtOwogICAgc2NhbmYoIiVkIiwgJnRudW0pOwogCiAgICBmb3IgKGkgPSAwOyBpIDwgdG51bTsgKytpKSB7CiAgICAgICAgbWF0cml4IGluaSwgdHJzOwogICAgICAgIGludCBuLCBtLCBqLCBrOwogICAgICAgIHNjYW5mKCIlZCVkIiwgJm4sICZtKTsKICAgICAgICBtX2luaXQoaW5pLCBuLCAxKTsKICAgICAgICBtX2luaXQodHJzLCBuLCBuKTsKIAogICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG47ICsraykgewogICAgICAgICAgICAgICAgaW50IHA7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCAmcCk7CiAgICAgICAgICAgICAgICBtX2VsKHRycywgaiwgaykgPSBwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opIHsKICAgICAgICAgICAgaW50IHA7CiAgICAgICAgICAgIHNjYW5mKCIlZCIsICZwKTsKICAgICAgICAgICAgbV9lbChpbmksIDAsIGopID0gcDsKICAgICAgICB9CiAKICAgICAgICBtYXRyaXggKm5tID0gbV9wb3codHJzLCAqbV9nZW5uKG4pLCBtKTsKICAgICAgICBtYXRyaXggcmVzOwogICAgICAgIG1faW5pdChyZXMsIG4sIDEpOwogICAgICAgIG1fbXVsKHJlcywgKm5tLCBpbmkpOwogCiAgICAgICAgcHJpbnRmKCJDYXNlICMlZDogIiwgaSArIDEpOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyArK2opCiAgICAgICAgICAgIHByaW50ZigiJWxkJWMiLCBtX2VsKHJlcywgaiwgMCksICBqICsgMSA9PSBuID8gJ1xuJyA6ICcgJyk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==