模板
#include <iostream>
#include <cstdio>
using namespace std;
const int MOD = 998244353;
int inv2, inv6, n, a, b, c;
long long quickPower (long long x, long long y) {
long long res = 1;
while (y) {
if (y & 1) res = res * x % MOD;
x = x * x % MOD;
y >>= 1;
}
return res;
}
struct Euclid {
Euclid () {
f = g = h = 0;
}
long long f, g, h;
};
Euclid calc (long long n, long long a, long long b, long long c) {
long long ac = a / c, bc = b / c, m = (a * n + b) / c, n1 = n + 1, n21 = n * 2 + 1;
Euclid d;
if (!a) {
d.f = bc * n1 % MOD;
d.g = bc * n % MOD * n1 % MOD * inv2 % MOD;
d.h = bc * bc % MOD * n1 % MOD;
return d;
}
if (a >= c || b >= c) {
Euclid e = calc(n, a % c, b % c, c);
d.f = ((n * n1 % MOD * inv2 % MOD * ac % MOD + bc * n1 % MOD) % MOD + e.f) % MOD;
d.g = ((ac * n % MOD * n1 % MOD * n21 % MOD * inv6 % MOD + bc * n % MOD * n1 % MOD * inv2 % MOD) % MOD + e.g) % MOD;
d.h = ((ac * ac % MOD * n % MOD * n1 % MOD * n21 % MOD * inv6 % MOD + bc * bc % MOD * n1 % MOD + ac * bc % MOD * n % MOD * n1 % MOD) % MOD + e.h + 2 * bc % MOD * e.f % MOD + 2 * ac % MOD * e.g % MOD) % MOD;
return d;
}
Euclid e = calc(m - 1, c, c - b - 1, a);
d.f = ((n * m % MOD - e.f) % MOD + MOD) % MOD;
d.g = ((m * n % MOD * n1 % MOD - e.h - e.f) % MOD + MOD) % MOD * inv2 % MOD;
d.h = ((n * m % MOD * (m + 1) % MOD - 2 * e.g - 2 * e.f - d.f) % MOD + MOD) % MOD;
return d;
}
inline void init () {
scanf("%d%d%d%d", &n, &a, &b, &c);
Euclid ans = calc(n, a, b, c);
printf("%lld %lld %lld\n", ans.f, ans.h, ans.g);
}
int main () {
inv2 = quickPower(2, MOD - 2);
inv6 = quickPower(6, MOD - 2);
int t;
scanf("%d", &t);
while (t --) init();
return 0;
}