萌新 dp 题求取模
查看原帖
萌新 dp 题求取模
560516
喵仔牛奶楼主2022/8/27 21:23

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;
}

2022/8/27 21:23
加载中...