1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| using ll = long long;
constexpr int mod = 998244353, inv2 = 499122177, inv6 = 166374059;
int Add(ll t) { return (t % mod + mod) % mod; }
template<typename... Ts> int Add(ll t, Ts... r) { return ((t + Add(r...)) % mod + mod) % mod; }
int Mul(ll t) { return t % mod; }
template<typename... Ts> int Mul(ll t, Ts... r) { return (t * Mul(r...)) % mod; }
struct Node { int f, g, h;
Node() {}
Node(int F, int G, int H): f(F), g(G), h(H) {} };
Node solve(ll N, int a, int b, int c) { int fac = a / c, fbc = b / c; ll m = (1ll * a * N + b) / c, Np = N + 1, N2p = N << 1 | 1; if (!a) return Node(Mul(fbc, Np), Mul(fbc, N, Np, inv2), Mul(fbc, fbc, Np));
Node z, y; if (a >= c || b >= c) { z.f = Add(Mul(N, Np, inv2, fac), Mul(fbc, Np)); z.g = Add(Mul(fac, N, Np, N2p, inv6), Mul(fbc, N, Np, inv2)); z.h = Add(Mul(fac, fac, N, Np, N2p, inv6), Mul(fbc, fbc, Np), Mul(fac, fbc, N, Np)); y = solve(N, a % c, b % c, c); z.f = Add(z.f, y.f); z.g = Add(z.g, y.g); z.h = Add(z.h, y.h, Mul(2, fbc, y.f), Mul(2, fac, y.g)); return z; }
y = solve(m - 1, c, c - b - 1, a); z.f = Add(Mul(N, m), -y.f); z.g = Mul(Add(Mul(N, m, Np), -y.f, -y.h), inv2); z.h = Add(Mul(N, m, m + 1), -2 * y.g, -2 * y.f, -z.f); return z; }
int main() { int T; Node ans;
cin >> T; for (int N, a, b, c; T; --T) { cin >> N >> a >> b >> c; ans = solve(N, a, b, c); cout << ans.f << ' ' << ans.h << ' ' << ans.g << '\n'; } return 0; }
|