import std; void main () { const long MOD = 998244353; int caseNum = readln.chomp.to!int; auto ans = new long[](caseNum); foreach (caseId; 0 .. caseNum) { int A, B, K; readln.read(A, B, K); if (B == 0 || B == 1) { if (0 <= A) { ans[caseId] = 1L * A * K % MOD; } else { ans[caseId] = 0; } continue; } if (B == -1) { if (0 <= A) { ans[caseId] = 1L * A * K % MOD; } else { ans[caseId] = 1L * -A * (K - 1) % MOD; } continue; } if (2 <= B) { if (0 <= A) { ans[caseId] = A * mod_pow(B, K - 1, MOD) % MOD; } else { ans[caseId] = 0; } continue; } if (B <= -2) { long rem = K; if (0 <= A) { long v = A; rem--; if (rem % 2 == 1) { v += A; rem--; } v *= mod_pow(-B, rem, MOD); v %= MOD; ans[caseId] = v; } else { if (rem == 1) { ans[caseId] = 0; } else { long v = -A; rem--; if (rem % 2 == 0) { v += -A; rem--; } v *= mod_pow(-B, rem, MOD); v %= MOD; ans[caseId] = v; } } continue; } enforce(caseId < 0); } writefln("%(%s\n%)", ans); } void read (T...) (string S, ref T args) { import std.conv : to; import std.array : split; auto buf = S.split; foreach (i, ref arg; args) { arg = buf[i].to!(typeof(arg)); } } long mod_pow (long a, long x, const long MOD) in { assert(0 <= x, "x must satisfy 0 <= x"); assert(1 <= MOD, "MOD must satisfy 1 <= MOD"); assert(MOD <= int.max, "MOD must satisfy MOD*MOD <= long.max"); } do { // normalize a %= MOD; a += MOD; a %= MOD; long res = 1L; long base = a; while (0 < x) { if (0 < (x&1)) (res *= base) %= MOD; (base *= base) %= MOD; x >>= 1; } return res % MOD; }