• OI


    还差很多


    # 题面

    有一个长度为 (n) 的数列 ({a_1,a_2,dots,a_n}) 和一个整数 (b),初始 (a_i=0,b=0)(a_i) 值域为 ([0,m-1])。进行 (Q) 次操作,每次操作是下列所有操作中的一种:

    • A l r v:对 (iin[l,r])(a_ileftarrowmax{a_i,v}),这种操作一共包含 (m imes frac{n(n+1)}{2}) 种;
    • B l r v:对 (iin[l,r])(a_ileftarrowmin{a_i,v}),这种操作一共包含 (m imes frac{n(n+1)}{2}) 种;
    • C l r(bleftarrow b+sum_{i=l}^ra_i),这种操作一共包含 (frac{n(n+1)}2) 种。

    (Q) 次操作后 (b) 的期望(原题是求所有方案的 (b) 之和,本质一样……)。

    (1le n,m,Qle2 imes 10^5)


    # 解析

    这是一道利用期望线性性分拆贡献的好题:),具体分拆贡献分为两步:

    (Ⅰ)将 (mathbf{E(b)}) 分拆为每一次操作对 (mathbf b) 的贡献。

    由题意易知只有 C操作 会对 (b) 有贡献。若第 (i) 次操作是 C 操作,设其对 (b) 的贡献为 (ans_i)。一共有 ((2m+1)inom n2) 种操作,而 C 操作有 (inom n2) 种,于是某一次操作是 C 操作的概率是 (frac 1{2m+1})。然后可以写出下面的式子:

    [E(b)=sum_{j=1}^Qfrac1{2m+1}E(ans_j) ]

    考虑怎么计算 (E(ans_j))

    Tab.(a_{i,j}) 表示数字 (a_i)(j) 次操作后的值。

    (Ⅱ)将 (mathbf{E(ans_j)}) 分拆为每个 (mathbf{E(a_{i,j})}) 的贡献。

    某次操作区间包含 (a_i) 的概率为 (frac{i(n-i+1)}{inom n2}),则

    [E(ans_j)=sum_{i=1}^nfrac{i(n-i+1)}{inom n2}E(a_{i,j}) ]

    而对于 (E(a_{i,j})),要利用到将离散期望用概率表达的技巧:

    [E(a_{i,j})=sum_{k=0}^{m-1}P(a_{i,j}>k) ]

    为了方便计算上式的概率,我们定义一次操作对 (a_i) 有效,当且仅当:

    • 是 A/B 操作;
    • 操作区间包含 (i)
    • 如果是 A(max) 操作,则要求 (vge a_i);如果是 B(min) 操作,则要求 (v< a_i)

    那么可以推得某一次操作对 (a_i) 有效的概率为 (H_i=frac{i(n-i+1)}{inom n2}cdotfrac{2m}{2m+1}cdotfrac{a_i+(m-a_i-1)}{m}),发现概率与 (a_i) 无关。

    那么什么时候会有 (a_{i,j}>k)?当且仅当最后一次有效操作(v)(v>k)。所以 (P(a_{i,j}>k)) 可以这样计算:

    • 在前 ((j-1)) 次操作中(第 (j) 次是 C 操作,一定无效)存在有效操作:([1-(1-H_i)^{j-1}])(即从所有方案中减去 (j-1) 次操作都无效的方案);
    • 最后一次有效操作 (v>k)(frac{m-k-1}m)

    所以 (P(a_{i,j}>k)=frac{m-k-1}m[1-(1-H_i)^{j-1}])

    综上

    [egin{aligned} E(a_{i,j})&=sum_{k=0}^{m-1} frac{m-k-1}mcdot[1-(1-H_i)^{j-1}]\ &=[1-(1-H_i)^{j-1}]cdot frac{m-1}2\ E(ans_j)&=sum_{i=1}^n frac{i(n-i+1)}{ binom n2}cdot[1-(1-H_i)^{j-1}]cdot frac{m-1}2 end{aligned} ]

    最后

    [egin{aligned} E(b)&=sum_{j=1}^Qsum_{i=1}^n frac{i(n-i+1)}{ binom n2}cdot[1-(1-H_i)^{j-1}]cdot frac{m-1}2\ &=frac{m-1}2cdotsum_{i=1}^n frac{i(n-i+1)}{ binom n2}sum_{j=1}^Qcdot[1-(1-H_i)^{j-1}] end{aligned} ]

    后面对 (1-(1-H_i)^{j-1}) 的式子求和就用等比数列,可以做到 (O(log Q)),于是总复杂度 (O(nlog Q))


    # 源代码

    /*Lucky_Glass*/
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    const int MOD=998244353;
    #define ci const int &
    
    inline int Add(ci a,ci b){return a+b>=MOD? a+b-MOD:a+b;}
    inline int Sub(ci a,ci b){return a-b<0? a-b+MOD:a-b;}
    inline int Mul(ci a,ci b){return 1ll*a*b%MOD;}
    inline int Pow(ci a,ci b){return b? Mul(Pow(Mul(a,a),b>>1),(b&1)? a:1):1;}
    
    int n,m,Q;
    
    //p^0+p^1+...+p^(t-1)
    int loca(int varp,int vart){return Mul(Sub(Pow(varp,vart),1),Pow(Sub(varp,1),MOD-2));}
    int main(){
        scanf("%d%d%d",&n,&m,&Q);
        int var1=Pow(Mul(n,n+1),MOD-2),var2=Pow(2*m+1,MOD-2),var3=Mul(Sub(m,1),Pow(2,MOD-2)),ans=0;
        for(int i=1;i<=n;i++){
            int varq=Mul(Mul(i,n-i+1),Mul(var1,var2)),varp=Mul(Mul(Mul(m,i),n-i+1),Mul(var1,var2));
            varp=Mul(varp,2),varq=Mul(varq,2);
            int sum=Sub(Q,loca(Sub(1,varp),Q));
            ans=Add(ans,Mul(sum,Mul(var3,varq)));
        }
        int all=Pow(Mul(Mul(n,n+1),Mul(Pow(2,MOD-2),2*m+1)),Q);
        // printf("? %d
    ",all);
        printf("%d
    ",Mul(ans,all));
        return 0;
    }
    

    THE END

    Thanks for reading!

    [egin{split} “ &未料想在你手中 最过珍惜的三尺青锋\ &会在某一日 为某一个人\ &纵起破长空 做了一世真英雄 ”\ ——& ext{《何日重到苏澜桥》By 泠鸢yousa} end{split} ]

    Linked 何日重到苏澜桥-Bilibili

  • 相关阅读:
    java 下载文件
    springfox-swagger之swagger-bootstrap-ui
    ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
    An internal error occurred during: Initializing Java Tooling.
    hexo 报错 Cannot read property 'replace' of null
    点击此电脑,查看属性获取计算机的基本信息,可以获取那些计算机基础知识信息呢
    微信、qq可以上网,但是浏览器却不能上网怎么办
    maven打包如何跳过测试
    Ubuntu16.04安装和配置RabbitMQ
    Jenkins持续集成实践之java项目自动化部署
  • 原文地址:https://www.cnblogs.com/LuckyGlass-blog/p/14276851.html
Copyright © 2020-2023  润新知