Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32440 | gaochunzhen | 【S】T3 | C++ | 通过 | 100 | 120 MS | 24928 KB | 2351 | 2024-09-08 17:24:39 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 9, B = 1e3 + 9, Mod = 998244353; int n, m, a[N], pw[N], iv[N], len[N], adj[B][B], cnt[N], id[N], to[N], tp; int add(int &x, int y) {x = (x + y >= Mod ? x + y - Mod : x + y);} int mns(int &x, int y) {x = (x < y ? x - y + Mod : x - y);} void slv() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { scanf("%d", &a[i]); } a[++m] = n + 1, tp = 0; memset(len, 0, sizeof(len)), memset(adj, 0, sizeof(adj)); memset(cnt, 0, sizeof(cnt)), memset(id, 0, sizeof(id)); for (int i = 1; i <= m; i++) { int x = a[i] - a[i - 1]; len[x]++; if (!id[x]) id[x] = ++tp, to[tp] = x; } for (int i = 1; i < m; i++) { int x = id[a[i] - a[i - 1]], y = id[a[i + 1] - a[i]]; adj[x][y]++, adj[y][x]++; } for (int i = 1; i <= tp; i++) { for (int j = i + 1; j <= tp; j++) { int l1 = to[i], l2 = to[j], x = adj[i][j], y = (1ll * len[l1] * len[l2] - x) % Mod; add(cnt[1], x), mns(cnt[l1 + 1], x), mns(cnt[l2 + 1], x), add(cnt[l1 + l2 + 1], x); add(cnt[2], y), mns(cnt[l1 + 2], y), mns(cnt[l2 + 2], y), add(cnt[l1 + l2 + 2], y); } int l = to[i], x = (adj[i][i] >> 1), y = (1ll * len[l] * (len[l] - 1) / 2 - x) % Mod; add(cnt[1], x), mns(cnt[l + 1], x), mns(cnt[l + 1], x), add(cnt[l * 2 + 1], x); add(cnt[2], y), mns(cnt[l + 2], y), mns(cnt[l + 2], y), add(cnt[l * 2 + 2], y); } for (int i = 1; i <= n; i++) add(cnt[i], cnt[i - 1]); for (int i = 1; i <= n; i++) add(cnt[i], cnt[i - 1]); int sum = 0, tot = 0; for (int i = 1; i <= n; i++) { sum += len[i] * (i - 1), tot += len[i]; } for (int i = 1; i <= n; i++) { add(cnt[i], sum), tot -= len[i], sum -= tot; } int ans = 0; for (int i = 2; i <= n; i++) { ans = (ans + 1ll * cnt[i] * pw[n + 1] % Mod * iv[i + 1]) % Mod; } printf("%d\n", ans); } signed main() { pw[0] = iv[1] = 1; for (int i = 1; i <= 1e6 + 1; i++) { pw[i] = 1ll * pw[i - 1] * i % Mod; } for (int i = 2; i <= 1e6 + 1; i++) { iv[i] = (ll)(Mod - Mod / i) * iv[Mod % i] % Mod; } int T; scanf("%d", &T); while (T--) slv(); return 0; }