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

浙公网安备 33010602011771号