• codeforces 1187F. Expected Square Beauty


    求$E({B(x)}^2)$,考虑$B(x)$为每一位与前一位不同的期望次数

    令$A(x)$表示第$x$位与第$x-1$位不同的概率,特别地,$A(1)=1$

    $$E({B(x)}^2)=E({(sum_{i=1}^n A(i))}^2)$$

    把式子展开得,

    $$E({B(x)}^2)=sum_{i=1}^n sum_{j=1}^n E(A(i) imes A(j))$$

    显然如果$|i-j|>1$,$A(i)$与$A(j)$是独立的,$E(A(i) imes A(j))=E(A(i)) imes E(A(j))$

    $A(x)$可以在$O(1)$的时间内算出来,$|i-j|>1$的情况也可以快速计算出来。

    若$|i-j|=0$,$E({A(i)}^2)=E(A(i))$。

    剩下的我们就要统计$a_{i-1} eq a_{i}且a_{i} eq a_{i+1}$这样的概率。

    可以用容斥$O(1)$计算出来。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 #define MOD 1000000007
     5 int l[200010], r[200010];
     6 int P[200010], sum[200010];
     7 inline int Power(int x, int y) {
     8     int ret = 1;
     9     while(y) {
    10         if(y & 1) ret = 1ll * ret * x % MOD;
    11         x = 1ll * x * x % MOD; y >>= 1;
    12     }
    13     return ret;
    14 }
    15 inline int min(int a, int b, int c) {
    16     return min(a, min(b, c));
    17 }
    18 inline int max(int a, int b, int c) {
    19     return max(a, max(b, c));
    20 }
    21 inline int calc(int l, int r) {
    22     if(l > r) return 0;
    23     int ret = sum[r] - sum[l - 1] + MOD;
    24     if(ret >= MOD) ret -= MOD;
    25     return ret;
    26 }
    27 inline void Add(int &x, int y) {
    28     x += y;
    29     if(x >= MOD) x -= MOD;
    30 }
    31 int main(){
    32     int n;
    33     scanf("%d", &n);
    34     for(int i = 1; i <= n; ++ i) {
    35         scanf("%d", &l[i]);
    36         -- l[i];
    37     }
    38     for(int i = 1; i <= n; ++ i) {
    39         scanf("%d", &r[i]);
    40     }
    41     P[1] = 1;
    42     for(int i = 2; i <= n; ++ i) {
    43         int B = 1ll * (r[i - 1] - l[i - 1]) * (r[i] - l[i]) % MOD;
    44         int A = min(r[i - 1], r[i]) - max(l[i - 1], l[i]);
    45         if(A < 0) A = 0;
    46         P[i] = 1ll * (B - A + MOD) * Power(B, MOD - 2) % MOD;
    47     }
    48     for(int i = 1; i <= n; ++ i) {
    49         sum[i] = sum[i - 1] + P[i];
    50         if(sum[i] >= MOD) sum[i] -= MOD;
    51     }
    52     int Ans = 0;
    53     for(int i = 1; i <= n; ++ i) {
    54         Add(Ans, P[i]);
    55         Add(Ans, 1ll * P[i] * calc(1, i - 2) % MOD);
    56         Add(Ans, 1ll * P[i] * calc(i + 2, n) % MOD);
    57     }
    58     for(int i = 2; i <= n; ++ i) {
    59         if(i == 2) {
    60             Add(Ans, 2 * P[i] % MOD);
    61             continue;
    62         }
    63         int E = 1;
    64         E -= (1 - P[i] + MOD);
    65         if(E < 0) E += MOD;
    66         E -= (1 - P[i - 1] + MOD);
    67         if(E < 0) E += MOD;
    68         int B = 1ll * (r[i - 2] - l[i - 2]) * (r[i - 1] - l[i - 1]) % MOD * (r[i] - l[i]) % MOD;
    69         int A = min(r[i - 2], r[i - 1], r[i]) - max(l[i - 2], l[i - 1], l[i]);
    70         if(A < 0) A = 0;
    71         E += 1ll * A * Power(B, MOD - 2) % MOD;
    72         if(E >= MOD) E -= MOD;
    73         Add(Ans, E * 2 % MOD);
    74     }
    75     printf("%d
    ", Ans);
    76 }
  • 相关阅读:
    P1182 数列分段 Section II 题解
    P3853 路标设置题解
    二分模板
    P2678 跳石头题解
    P2440 木材加工题解
    P1024 一元三次方程求解题解
    快速下载vscode的方法
    P1824 进击的奶牛题解
    P1873 砍树题解
    用户登录之asp.net cookie的写入、读取与操作
  • 原文地址:https://www.cnblogs.com/iamqzh233/p/11137506.html
Copyright © 2020-2023  润新知