Skip to content

Commit 20b4094

Browse files
committed
Many Many Sequence Covering Problems
1 parent aa57018 commit 20b4094

11 files changed

Lines changed: 122 additions & 0 deletions

File tree

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

QOJ/14816.cpp

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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+
}
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)