rt,dp 没问题,取模真的不会,求神犇调一下。
#include <bits/stdc++.h>
using namespace std;
const int N = 505, M = 105, Q = 1e5 + 5, mod = 998244353;
int f[N][N][M], g[N][N][2], L[N], R[N], n, m, now, q;
struct node {
int s, t, c, k, id, ans;
void upd(int qwq) {
ans -= 1LL * f[s][c][k - qwq] * g[c][t][qwq & 1] % mod;
ans = (ans + mod) % mod;
}
} s[Q];
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i ++) {
cin >> L[i] >> R[i], f[i][i][0] = g[i][i][0] = 1;
if (!L[i]) L[i] = 1;
}
for (int k = 1; k <= 100; k ++)
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
f[i][L[j]][k] = (f[i][L[j]][k] % mod + f[i][j][k - 1] % mod + mod) % mod;
f[i][R[j] + 1][k] = (f[i][R[j] + 1][k] % mod - f[i][j][k - 1] % mod + mod) % mod;
}
for (int j = 1; j <= n; j ++)
f[i][j][k] = (f[i][j][k] % mod + f[i][j - 1][k] % mod + mod) % mod;
}
for (int i = 1; i <= q; i ++) {
cin >> s[i].s >> s[i].t >> s[i].c >> s[i].k, s[i].id = i;
s[i].ans = f[s[i].s][s[i].t][s[i].k], s[i].upd(0);
}
for (int k = 1; k <= 100; k ++) {
int now = k & 1, last = (k & 1) ^ 1;
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= n; j ++)
g[i][j][now] = 0;
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= n; j ++) {
g[i][L[j]][now] = (g[i][L[j]][now] % mod + g[i][j][last] % mod + mod) % mod;
g[i][R[j] + 1][now] = (g[i][R[j] + 1][now] % mod - g[i][j][last] % mod + mod) % mod;
}
for (int j = 1; j <= n; j ++)
g[i][j][now] = (g[i][j][now] % mod + g[i][j - 1][now] % mod + mod) % mod;
g[i][i][now] = 0;
}
for (int i = 1; i <= q; i ++)
if (k <= s[i].k) s[i].upd(k);
}
for (int i = 1; i <= q; i ++)
cout << s[i].ans << '\n';
return 0;
}