|
| 1 | +#include <bits/stdc++.h> |
| 2 | +using namespace std; |
| 3 | + |
| 4 | +#define endl '\n' |
| 5 | + |
| 6 | +#define maxn 5005 |
| 7 | +#define mod 998244353 |
| 8 | + |
| 9 | +int64_t Mod(int64_t x) { return x >= mod ? x - mod : x; } |
| 10 | +int64_t Add(int64_t &x, int64_t y) { return x = Mod(x + y); } |
| 11 | + |
| 12 | +class SumStruct { |
| 13 | + private: |
| 14 | + int64_t g[maxn], h[maxn]; |
| 15 | + |
| 16 | + public: |
| 17 | + void init(int64_t f[]) { |
| 18 | + g[0] = f[0]; |
| 19 | + for (int i = 1; i < maxn; i++) g[i] = Mod(g[i - 1] + f[i]); |
| 20 | + |
| 21 | + h[0] = g[0]; |
| 22 | + for (int i = 1; i < maxn; i++) h[i] = Mod(h[i - 1] + g[i]); |
| 23 | + |
| 24 | + return; |
| 25 | + } |
| 26 | + int64_t getS(int l, int r) { return l == 0 ? g[r] : Mod(g[r] + mod - g[l - 1]); } |
| 27 | + int64_t getL(int l, int r) { return l == 0 ? h[r] : Mod(h[r] + mod - (h[l - 1] + (r - l + 1) * g[l - 1]) % mod); } |
| 28 | + int64_t getR(int l, int r) { return Mod(((r - l + 2) * getS(l, r) - getL(l, r)) % mod + mod); } |
| 29 | +}; |
| 30 | + |
| 31 | +int64_t f[maxn][maxn], g[maxn][maxn], fl[maxn], fr[maxn]; |
| 32 | +SumStruct FL, FR, G; |
| 33 | + |
| 34 | +int a[maxn], d[maxn], e[maxn]; |
| 35 | +int64_t Ac[maxn], Bc[maxn], Cc[maxn], Dc[maxn], Ec[maxn]; |
| 36 | +int64_t b[maxn], c[maxn], Bs[maxn], Cs[maxn]; |
| 37 | + |
| 38 | +void solve(void) { |
| 39 | + int n; |
| 40 | + cin >> n; |
| 41 | + for (int i = 1; i <= n; i++) cin >> a[i]; |
| 42 | + for (int i = 1; i <= n; i++) cin >> b[i]; |
| 43 | + for (int i = 2; i <= n + 1; i++) cin >> c[i]; |
| 44 | + for (int i = 1; i <= n; i++) cin >> d[i]; |
| 45 | + for (int i = 2; i <= n + 1; i++) cin >> e[i]; |
| 46 | + |
| 47 | + for (int i = 1; i <= n + 1; i++) { |
| 48 | + Ac[i] = (a[i] >= 0 ? 1 : -a[i] + 1); |
| 49 | + Bc[i] = (b[i] >= 0 ? 1 : -b[i] + 1); |
| 50 | + Cc[i] = (c[i] >= 0 ? 1 : -c[i] + 1); |
| 51 | + Dc[i] = (d[i] >= 0 ? 1 : -d[i] + 1); |
| 52 | + Ec[i] = (e[i] >= 0 ? 1 : -e[i] + 1); |
| 53 | + } |
| 54 | + |
| 55 | + for (int i = 1; i <= n + 1; i++) |
| 56 | + Bs[i] = (b[i] >= 0 ? b[i] : -b[i] * (-b[i] + 1) / 2) % mod, Cs[i] = (c[i] >= 0 ? c[i] : -c[i] * (-c[i] + 1) / 2) % mod; |
| 57 | + |
| 58 | + auto init = [&](int i) -> void { return FL.init(fl), FR.init(fr), G.init(g[i]); }; |
| 59 | + |
| 60 | + g[0][0] = 1; |
| 61 | + init(0); |
| 62 | + |
| 63 | + for (int i = 1; i <= n + 1; i++) { |
| 64 | + int64_t BcxCc = Bc[i] * Cc[i] % mod, BcxCs = Bc[i] * Cs[i] % mod, BsxCc = Bs[i] * Cc[i] % mod; |
| 65 | + |
| 66 | + for (int v = (a[i] >= 0 ? a[i] : 0); v <= (a[i] >= 0 ? a[i] : -a[i]); v++) { |
| 67 | + int vl = max(0, v - abs(d[i])), vr = min(maxn - 1, v + abs(e[i])); |
| 68 | + |
| 69 | + if (vl < v) { |
| 70 | + int64_t sumF = (d[i] >= 0 ? FR.getS(vl, v - 1) : FR.getR(vl, v - 1)), |
| 71 | + sumG = (d[i] >= 0 ? G.getS(vl, v - 1) : G.getR(vl, v - 1)); |
| 72 | + |
| 73 | + if (d[i] < 0 && v + d[i] < vl) { |
| 74 | + Add(sumF, FR.getS(vl, v - 1) * (vl - (v + d[i])) % mod); |
| 75 | + Add(sumG, G.getS(vl, v - 1) * (vl - (v + d[i])) % mod); |
| 76 | + } |
| 77 | + |
| 78 | + Add(f[i][v], Mod((sumF + sumG * BsxCc % mod * v) % mod * Ec[i] % mod + mod)); |
| 79 | + Add(g[i][v], sumG * Ec[i] % mod); |
| 80 | + } |
| 81 | + |
| 82 | + if (v <= vr) { |
| 83 | + int64_t sumF = (e[i] >= 0 ? FL.getS(v, vr) : FL.getL(v, vr)), |
| 84 | + sumG = (e[i] >= 0 ? G.getS(v, vr) : G.getL(v, vr)); |
| 85 | + |
| 86 | + if (e[i] < 0 && v - e[i] > vr) { |
| 87 | + Add(sumF, FL.getS(v, vr) * ((v - e[i]) - vr) % mod); |
| 88 | + Add(sumG, G.getS(v, vr) * ((v - e[i]) - vr) % mod); |
| 89 | + } |
| 90 | + |
| 91 | + Add(f[i][v], Mod((sumF - sumG * BcxCs % mod * v) % mod * Dc[i] % mod + mod)); |
| 92 | + Add(g[i][v], sumG * Dc[i] % mod); |
| 93 | + } |
| 94 | + |
| 95 | + g[i][v] = g[i][v] * BcxCc % mod; |
| 96 | + } |
| 97 | + |
| 98 | + BcxCc = Bc[i + 1] * Cc[i + 1] % mod, BcxCs = Bc[i + 1] * Cs[i + 1] % mod, BsxCc = Bs[i + 1] * Cc[i + 1] % mod; |
| 99 | + |
| 100 | + for (int v = 0; v < maxn; v++) |
| 101 | + fr[v] = Mod((f[i][v] * BcxCc - g[i][v] * BsxCc % mod * v) % mod + mod), |
| 102 | + fl[v] = Mod((f[i][v] * BcxCc + g[i][v] * BcxCs % mod * v) % mod + mod); |
| 103 | + |
| 104 | + init(i); |
| 105 | + } |
| 106 | + |
| 107 | + int64_t tot = 1; |
| 108 | + for (int i = 1; i <= n + 1; i++) tot = tot * Ac[i] % mod * Bc[i] % mod * Cc[i] % mod * Dc[i] % mod * Ec[i] % mod; |
| 109 | + |
| 110 | + cout << f[n + 1][0] << ' ' << Mod(tot + mod - g[n + 1][0]) << endl; |
| 111 | + |
| 112 | + return; |
| 113 | +} |
| 114 | + |
| 115 | +int main() { |
| 116 | + ios::sync_with_stdio(false), cin.tie(nullptr); |
| 117 | + |
| 118 | + int _ = 1; |
| 119 | + while (_--) solve(); |
| 120 | + |
| 121 | + return 0; |
| 122 | +} |
0 commit comments