1 条题解

  • 0
    @ 2025-8-24 22:20:23

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar littlebug
    AFO. || 女孩纸喵 > < || 喜欢天依宝宝喵 > <

    搬运于2025-08-24 22:20:23,当前版本为作者最后更新于2025-08-10 08:40:10,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    天依题!

    这边支持一下绫功依受呢喵~

    天依是真的可爱呀 ww


    先形式化一下题意:

    令当前吃过的店铺数为「血量」。

    定义一次操作为依次执行以下操作:

    • 重复当前血量次,以 p=abp = \frac a b 的概率血量减少 11,并且血量的下限为 00
    • 当前血量n\frac {\text 当前血量} n 的概率血量增加 11

    求血量达到 nn 的期望操作次数。

    没错,你会发现,这样好端端的一个天依题就变成了治疗之雨

    为什么要把增加放在后面呢?因为题意要求,判定是在吃完一个店铺之后立即进行的,并不包括这个时刻和下一个时刻之间的撤场事件。所以这样定义方便一点。


    dp,令 fif_i 为血量为 ii 时血量增加到 nn 的期望操作次数,令 gi,jg_{i,j} 为当血量为 ii 时,一轮操作血量减少 jj 的概率。

    先递推 fif_i。假设 gi,jg_{i,j} 已知,那么就只需要考虑血量是否增加就可以了,显然有:

    $$f_i = \sum _{j=0} ^i g_{i,j} \left( \frac {n-(i-j)} n f_{i-j+1} + \frac {i-j} n f_{i-j} \right) + 1 $$

    注意到有环没法直接递推,n3000n \le 3000 没法直接搞笑,不过把系数矩阵画出来并且旋转 180°180 \degree 后,可以发现死一个上三角矩阵但是每一行左边都多出来一个非 00 数,于是每次消元只消下一行就可以了,复杂度是 O(n2)O(n^2) 的。

    关于 gi,jg_{i,j},这个是容易的,考虑把这 ii 个血量是否减少画成一个 0101 序列,那么减少 jj 就是出现了 jj11,显然一个这样的序列出现概率是 pj×(1p)ijp^j \times (1-p)^{i-j};又因为总共有 (ij)\binom i j 个这样的序列,所以可以得到:

    gi,j=(ij)pj(1p)ijg_{i,j} = \binom i j p^j (1-p)^{i-j}

    时间复杂度还是 O(n2)O(n^2)

    代码为了方便,直接把 f0f_0 省略了,因为可以发现 dp 式子中所有 f0f_0 的系数都为 00,直接省略是没什么问题的。

    最后要输出 f1+1f_1 + 1,因为根据 dp 式子稍微推一下就可以得到 f0=f1+1f_0 = f_1 + 1


    int n;
    mint p,a[N][N],f[N];
    
    il void gauss(int n)
    {
        reverse(a+1,a+n+1); rep(i,1,n) reverse(a[i]+1,a[i]+n+1);
        int r=1,mx; mint t;
        rep(j,1,n)
        {
            mx=r; rep(i,r,r+1) if(a[i][j]>0) {mx=i; break;}
            mx^r && (swap(a[mx],a[r]),1);
            t=a[r+1][j]/a[r][j];
            rep(k,r,n+1) a[r+1][k]-=t*a[r][k];
            ++r;
        }
        rpe(j,n,1)
        {
            f[n-j+1]=a[j][n+1]/a[j][j];
            rep(i,1,j-1) a[i][n+1]-=a[i][j]*f[j],a[i][j]=0;
        }
    }
    
    il void solve()
    {
        read(n); {int x,y; read(x,y),p=x*ginv(y);}
        if(n==1) return write(1ll);
    
        mint iv=ginv(n);
        rep(i,1,n-1)
        {
            a[i][i]=-1.,a[i][n]=-1.;
            rep(j,0,i)
            {
            	i-j+1^n && (a[i][i-j+1]+=C(i,j)*fpow(p,j)*fpow(1-p,i-j)*(n-(i-j))*iv,1);
            	a[i][i-j]+=C(i,j)*fpow(p,j)*fpow(1-p,i-j)*(i-j)*iv;
            }
        }
        gauss(n-1);
    
        write((int)f[1]+1);
    }
    

    华风夏韵,洛水天依!

    Tip:并不仅仅是天依题的题解里才有最后这句话哦!

    • 1

    信息

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