[ARC111F] Do you like query problems? 题解

下文中,我们令一个数 \(a_x\) 在第 \(i\) 次操作中被改变,当且仅当满足下面两个条件之一:

  • 该操作中 \(t_i = 1\)\(l_i \le x \le r_i\)\(\bm{v_i < a_x}\)
  • 该操作中 \(t_i = 2\)\(l_i \le x \le r_i\)\(\bm{v_i \ge a_x}\)

现在我们考虑这些操作,我们会惊喜的发现,对于一个固定的 \(a_x\)\(\forall a_x' \in [0, M)\),使 \(a_x = a_x'\) 的操作数总是相同的!这样我们推柿子时会方便很多。
易知对于一个数 \(a_x\),某次操作改变它的概率为:

\[\frac{x(N - x + 1)}{\frac{N(N + 1)}{2}} \cdot \frac{2M}{2M + 1} \cdot \frac{a_x + M - a_x}{2M} = \frac{2Mx(N - x + 1)}{N(N + 1)(2M + 1)} \]

记其为 \(p_x\),显然 \(p_x\) 不受 \(a_x\) 的影响,且由上文的性质来看,每次操作若改变了 \(a_x\),则 \(a_x\) 变成某个数是等概率的!
我们在考虑把贡献差分一下,即对于每一个 \(a_x\) 其贡献会在所有 \(y < x\)\(y\) 计算 \(1\) 的贡献。
\(f_{i, j, k}\) 表示对于前 \(i\) 个操作后,\(a_j\)\(k\) 处的贡献之和,则:

\[f_{i, j, k} = \frac{M - k - 1}{M}\cdot(1 - (1 - p_j)^i) \]

则前 \(i\) 个操作后,\(a_j\) 的期望值即为:

\[\sum_{k = 0}^{M - 1} f_{i, j, k} = (\frac{M \cdot M - M}{M} - \frac{M(M - 1)}{2M}) \cdot (1 - (1 - p_j)^i) = \frac{M - 1}{2} \cdot (1 - (1 - p_j)^i) \]

统计答案的时候,可以枚举每个位置与每次操作计算:

\[\begin{aligned} &{\,\,\,\,\,\,\,}\sum_{i = 0}^{Q - 1} \sum_{j = 1}^{N} \sum_{k = 1}^{M - 1} \frac{j(N - j + 1)}{\frac{N(N + 1)}{2}} \cdot \frac{1}{2M + 1} \cdot f_{i, j, k} \\ &= \sum_{i = 0}^{Q - 1} \sum_{j = 1}^{N} \frac{j(N - j + 1)}{\frac{N(N + 1)}{2}} \cdot \frac{1}{2M + 1} \cdot \frac{M - 1}{2} \cdot (1 - (1 - p_j)^i) \\ &= \frac{M - 1}{N(N + 1)(2M + 1)} (\sum_{i = 0}^{Q - 1} \sum_{j = 1}^{N} j(N - j + 1) \cdot (1 - (1 - p_j)^i)) \\ &= \frac{M - 1}{N(N + 1)(2M + 1)} (\sum_{j = 1}^{N} j(N - j + 1) (Q - \frac{(1 - p_j)^Q - 1}{-p_j})) \\ &= \frac{M - 1}{N(N + 1)(2M + 1)} (\sum_{j = 1}^{N} j(N - j + 1) (Q + \frac{(1 - p_j)^Q - 1}{p_j})) \\ \end{aligned} \]

最后记得将期望转化为方案数。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll Read() {
	int sig = 1;
	ll num = 0;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') {
			sig = -1;
		}
		c = getchar();
	}
	while(isdigit(c)) {
		num = (num << 3) + (num << 1) + (c ^ 48);
		c = getchar();
	}
	return num * sig;
}
void Write(ll x) {
	if(x < 0) {
		putchar('-');
		x = -x;
	}
	if(x >= 10) {
		Write(x / 10);
	}
	putchar((x % 10) ^ 48);
}

const ll Mod = 998244353;
int n, m, q;
ll res;
inline ll QuickPow(ll x, ll y, ll Mod) {
	ll res = 1;
	while(y) {
		if(y & 1) res = res * x % Mod;
		x = x * x % Mod, y >>= 1;
	}
	return res;
}

int main() {
	int i;
	n = Read(), m = Read(), q = Read();
	for(i = 1; i <= n; i++) {
		ll p = 2ll * m * i % Mod * (n - i + 1) % Mod * QuickPow(1ll * n * (n + 1) % Mod * (2ll * m + 1) % Mod, Mod - 2, Mod) % Mod;
		res = (res + 1ll * i * (n - i + 1) % Mod * (q + (QuickPow(Mod + 1 - p, q, Mod) - 1) * QuickPow(p, Mod - 2, Mod) % Mod) % Mod) % Mod;
	}
	Write(1ll * QuickPow(1ll * n * (n + 1) / 2 % Mod * (2ll * m + 1) % Mod, q, Mod) * (m - 1) % Mod * QuickPow(1ll * n * (n + 1) % Mod * (2ll * m + 1) % Mod, Mod - 2, Mod) % Mod * res % Mod);
	return 0;
}
posted @ 2025-02-18 15:06  Include_Z_F_R_qwq  阅读(24)  评论(0)    收藏  举报