1 条题解

  • 0
    @ 2025-8-24 22:34:55

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar ETHANK
    「我是星 我愿投身前途未卜的群星,为梦长明。」

    搬运于2025-08-24 22:34:55,当前版本为作者最后更新于2021-12-26 06:52:44,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目难度:USACO P/省选-

    不难发现猜 HI 的数不会使猜 LO 的数被跳过。设 y=Nxy=N-x ,那么原题相当于将 a1,a2,,axa_1,a_2,\dots,a_xb1,b2,,byb_1,b_2,\cdots,b_y 排列,只记录 a,ba,b 的每次下标最大值的出现位置,求期望 baba 的数量。

    这可以 dp ,设 dp[i][j][0/1]dp[i][j][0/1] 为当前最大出现 ai,bja_i,b_j 以及最后一个出现的是 a/ba/b ,通过简单的转移可以做到 O(N3)O(N^3) 。前缀和优化可以做到 O(N2)O(N^2) ,这里不再赘述。

    比较吸引我的是在赛后讨论中看到的 O(N)O(N) 做法,这里简单的证明一下。

    结论:令 H0=0,HN=1+12++1NH_0=0,H_N=1+\frac{1}{2}+\cdots+\frac{1}{N} . 有

    E[#(ba)]=12(Hx+HyHN+yN)E[\#(ba)]=\frac{1}{2}(H_x+H_y-H_N+\frac{y}{N})\\

    证明:

    x=0x=0y=0y=0 时结论显然成立,不妨对 yy 归纳。即证 (x,y)(x,y+1)(x,y)\to(x,y+1) 后期望的变化为:

    $$\Delta=\frac12(\frac1{y+1}-\frac{1}{N+1}+\frac{y+1}{N+1}-\frac{y}{N})=\frac{1}{2(y+1)}-\frac{y}{2N(N+1)} $$

    计算对 a1a2axb2b3bya_1a_2\dots a_xb_2b_3\dots b_y 的排列中插入 b1b_1 对答案的贡献, b1b_1 只能排在第一个出现的 bb 之前,否则会被跳过。yybbxxaa 分成 y+1y+1 段,故第一个 bbaa 的期望个数为 xy+1\frac{x}{y+1} 个。设前面有 kkaa

    接下来,只要 b1b_1 被插入在 kkaa 中最大的 aa 前面,都会对期望贡献一个 "ba" 。最大的 aa 的期望位置为:

    $$E[index]=\left\{\begin{matrix} \frac{k+1}2,\qquad k>0\\ 0,\qquad k=0\\ \end{matrix}\right. $$

    k=0k=0 即为原排列首项是 bb 的概率,为 yN\frac{y}{N} 。 能得出:

    $$\Delta = \frac{1}{N+1}(\frac{1}{2}\times(\frac{x}{y+1}+1)-\frac{y}{N}\times\frac{0+1}{2})\\ =\frac{1}{2(y+1)}-\frac{y}{2N(N+1)} $$
    const int N=2e5+5,P=1e9+7;
    int n,x;
    ll H[N],inv[N];
    int main(){
        n=read(),x=read();
        inv[1]=1;
        ll fac = 1;
        rep(i,2,n){
            inv[i]=(P-P/i)*inv[P%i]%P;
            fac = fac*i%P;
        }
        rep(i,1,n)H[i]=(H[i-1]+inv[i])%P;
        int y = n-x;
        cout<<(fac*inv[2]%P*(inv[n]*y%P+H[x]+H[y]-H[n])%P+P)%P;
        return 0;
    }
    
    • 1

    信息

    ID
    7360
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者