有一个长度为 n 的数组 对这个数组施展 m 次魔法,每次可以对于给定的 (l,r,d),让其中的 al→ar 都加上 d 但是,不会全部施法成功,而是会随机且等概率地失效一个魔法 问,在这种情况下,数组 a 的最大值的期望是多少 (对于每个测试数据,输出一行一个整数表示数组的最大值对 998244353 取模的值
int n, m, a[N], l[N], r[N], d[N]; intqmi(int a, int b){ int res = 1, t = a;
while (b) { if (b & 1) res = res * a % MOD; a = a * a % MOD, b >>= 1; }
return res; } voidsolve(){ cin >> n >> m; vector<int> cf(n + 10); for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= m; i++) { cin >> l[i] >> r[i] >> d[i]; cf[l[i]] += d[i], cf[r[i] + 1] -= d[i]; }
for (int i = 1; i <= n; i++) cf[i] += cf[i - 1], a[i] += cf[i];
vector<int> pre(n + 10), suf(n + 10); for (int i = 1; i <= n; i++) pre[i] = max(pre[i - 1], a[i]); for (int i = n; i >= 1; i--) suf[i] = max(suf[i + 1], a[i]);
int ans = 0;
for (int i = 1; i <= m; i++) { int L = l[i], R = r[i], D = d[i]; if (pre[L - 1] == pre[n] || suf[R + 1] == suf[1]) ans += pre[n]; else ans += max(pre[n] - D, max(pre[L - 1], suf[R + 1]));
ans %= MOD; }
ans *= qmi(m, MOD - 2); cout << ans % MOD << endl; }
期望的计算公式是: 期望 = 所有可能情况总和 / 情况数 在此题中是 期望 = ans / q
在除运算中,不能直接模 (a / b) % c != (a % c) / (b % c)
这时就要用到逆元 a / b ≡ a * b^{-1} (mod p)
b^{-1} 代表 b 的逆元,计算逆元用到了费马小定理 如果 p 是质数,且 p 和 q 互质,则 q^{p-2} ≡ q^{-1} (mod p) 因此,qp−2%p 返回 q 的逆元