#include using namespace std; const int P = 998244353; const int N = 2; int t; struct Matrix { int a[N][N]; Matrix(int val = 0) { memset(a, 0, sizeof a); for (int i = 0; i < N; i++) a[i][i] = val; } Matrix operator * (const Matrix &t) const { Matrix ret; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) ret.a[i][j] = (ret.a[i][j] + 1LL * a[i][k] * t.a[k][j]) % P; return ret; } Matrix operator *= (const Matrix &t) { return *this = *this * t; } Matrix operator ^ (int t) const { Matrix ret(1); for (Matrix tmp = *this; t; t >>= 1, tmp *= tmp) if (t & 1) ret *= tmp; return ret; } Matrix operator ^= (int t) { return *this = *this ^ t; } void init() { a[0][0] = a[0][1] = a[1][0] = 1; a[1][1] = P - 1; } } s, m; int read() { int x = 0, p = 1; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') p = -1; for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + (c & 15); return x * p; } int write(int x) { if (x >= 10) write(x / 10); putchar(x % 10 + '0'); } int writeln(int x) { write(x); putchar('\n'); } int main() { m.init(); t = read(); while (t--) { s.a[0][0] = read(); s.a[0][1] = read(); s *= m ^ read(); printf("%d %d\n", s.a[0][0], s.a[0][1]); } return 0; }