Codeforces 1187F Expected Square Beauty
题目链接
https://codeforces.com/contest/1187/problem/F
题目大意
一个长度为 $n$ 的数列 $x$ ,每个位置上等概率出现 $L_i$ 到 $r_i$ 之间的数。设 $B(x)$ 为该数列的连续相同数字子段的个数,求 $E((B(x))^2)$。
题目分析
设 $f(i) = [x_i \neq x_{i – 1}]$ ,则有 $B(x) = \sum\limits_{i=1}^{n}f(i)$, 则有 $E((B(x))^2) = E((\sum\limits_{i=1}^{n}f(i))^2)$
将内层展开,则有 $E((B(x))^2) = \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}{E(f(i)f(j))}$
考虑计算 $E(f(i)f(j))$ ,则会出现三种情况。
-
$|i – j| > 1$,那么显然 $f(i)$ 于 $f(j)$ 之间互不影响,答案显然为 $E(f(i))E(f(j))$
-
$i = j$ ,显然 $f(i)$ 和 $f(j)$ 要么同时发生,要么同时不发生,因此答案显然为 $E(f(i))$
-
$|i – j| = 1$,那么显然他们之间会互相影响,那么需要求的是 $[x_i \neq x_{x – 1} \& x_j \neq x_{j – 1}]$。
显然 $1$ 和 $2$ 中的可以直接用 $1$ 减去 $x_i = x_{i – 1}$ 的概率求出,而 $3$ 中的使用容斥也同样很容易求出来。
最后将这些求和即可得到答案。
代码
#include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 5; const int mod = 1e9 + 7; int n; long long L[maxn]; long long R[maxn]; long long p[maxn]; long long qpow(long long b, long long x){ long long ret = 1; while(x){ if(x & 1){ ret = ret * b % mod; } x >>= 1; b = b * b % mod; } return ret; } int main(){ int i, j; long long ans = 0; long long sum = 0; scanf("%d", &n); for(i=1;i<=n;i++){ scanf("%lld", &L[i]); } for(i=1;i<=n;i++){ scanf("%lld", &R[i]); } for(i=1;i<=n;i++){ p[i] = (mod + 1 - max(0ll, min(R[i], R[i - 1]) - max(L[i], L[i - 1]) + 1) * qpow((R[i] - L[i] + 1) * (R[i - 1] - L[i - 1] + 1) % mod, mod - 2) % mod) % mod; ans = (ans - p[i] * p[i] + p[i]) % mod; ans = (ans + mod) % mod; sum += p[i]; } sum %= mod; ans = (ans + sum * sum) % mod; for(i=2;i<=n;i++){ ans = (ans - 2ll * p[i] * p[i - 1] % mod + mod) % mod; long long x = 1 - (1 - p[i]) - (1 - p[i - 1]) + max(0ll, min(min(R[i], R[i - 1]), R[i - 2]) - max(max(L[i], L[i - 1]), L[i - 2]) + 1) * qpow((R[i] - L[i] + 1) * (R[i - 1] - L[i - 1] + 1) % mod * (R[i - 2] - L[i - 2] + 1) % mod, mod - 2) % mod; ans += 2ll * x; ans %= mod; } printf("%lld\n", (ans + mod) % mod); return 0; }