Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
32431 | gaochunzhen | 【S】T3 | C++ | 通过 | 100 | 542 MS | 18256 KB | 2669 | 2024-09-08 17:13:55 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6 + 9, B = 1e3 + 9, Mod = 998244353; int fpow(int a, int b = Mod - 2) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % Mod; a = 1ll * a * a % Mod, b >>= 1; } return res; } int n, m, a[N], pw[N], len[N], adj[B][B], cnt[N]; int inl[N], tp; int id(int x) {return lower_bound(inl + 1, inl + tp + 1, x) - inl;} 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; memset(len, 0, sizeof(len)), memset(adj, 0, sizeof(adj)); memset(cnt, 0, sizeof(cnt)); for (int i = 1; i <= m; i++) { len[a[i] - a[i - 1]]++; inl[i] = a[i] - a[i - 1]; } sort(inl + 1, inl + m + 1); tp = unique(inl + 1, inl + m + 1) - inl - 1; 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 = inl[i], l2 = inl[j], x = adj[i][j], y = (1ll * len[l1] * len[l2] - x) % Mod; // cout << l1 << ' ' << l2 << ' ' << x << ' ' << y << endl; 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 = inl[i], x = (adj[i][i] >> 1), y = (1ll * len[l] * (len[l] - 1) / 2 - x) % Mod; // cout << l << ' ' << x << ' ' << y << endl; add(cnt[1], x), mns(cnt[l + 1], x), mns(cnt[l + 1], x), add(cnt[l + l + 1], x); add(cnt[2], y), mns(cnt[l + 2], y), mns(cnt[l + 2], y), add(cnt[l + l + 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]; } // memset(cnt, 0, sizeof(cnt)); 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 * fpow(i + 1)) % Mod; } printf("%d\n", ans); } signed main() { pw[0] = 1; for (int i = 1; i <= 1e6 + 1; i++) { pw[i] = 1ll * pw[i - 1] * i % Mod; } int T; scanf("%d", &T); while (T--) slv(); return 0; }