题解 [MtOI2019]小铃的烦恼

答案

设答案的期望为 E [ X ] E[X] E[X],其中 X X X 为步数的随机变量,若设 Y Y Y 为最后字符的随机变量,则由全期望公式
E [ X ] = E [ E [ X ∣ Y ] ] = ∑ y = 1 ∑ P ( y = Y ) E [ X ∣ Y = y ] E[X]=E[E[X|Y]]=\sum_{y=1}^{\sum} P(y=Y)E[X|Y=y] E[X]=E[E[XY]]=y=1P(y=Y)E[XY=y]

概率

假设当前字符为 y y y,出现次数为 i i i,若设 O P T OPT OPT 为此次操作的随机变量,则由全概率公式
P i ( Y = y ) = ∑ o p t P ( O P T = o p t ) P i ( Y = y ∣ O P T = o p t ) = i ( i − 1 ) + ( n − i ) ( n − i − 1 ) n ( n − 1 ) P i ( Y = y ) + i ( n − i ) n ( n − 1 ) ( P i + 1 ( Y = y ) + P i − 1 ( Y = y ) ) P_i(Y=y)=\sum_{opt} P(OPT=opt)P_i(Y=y|OPT=opt) \\ =\frac{i(i-1)+(n-i)(n-i-1)}{n(n-1)}P_i(Y=y)+\frac{i(n-i)}{n(n-1)}(P_{i+1}(Y=y)+P_{i-1}(Y=y)) Pi(Y=y)=optP(OPT=opt)Pi(Y=yOPT=opt)=n(n1)i(i1)+(ni)(ni1)Pi(Y=y)+n(n1)i(ni)(Pi+1(Y=y)+Pi1(Y=y))
化简得 P i ( Y = y ) = P i − 1 ( Y = y ) + P i + 1 ( Y = y ) 2 P_i(Y=y)=\frac{P_{i-1}(Y=y)+P_{i+1}(Y=y)}{2} Pi(Y=y)=2Pi1(Y=y)+Pi+1(Y=y),发现是等差数列,由于 P 0 ( y = Y ) = 0 , P n ( Y = y ) = 1 P_0(y=Y)=0, P_n(Y=y)=1 P0(y=Y)=0,Pn(Y=y)=1,故 P i ( Y = y ) = i n P_i(Y=y)=\frac{i}{n} Pi(Y=y)=ni

期望

T T T Y = y Y=y Y=y 这个事件,即最后的字符是 y y y

E i [ X ∣ T ] E_i[X|T] Ei[XT] (事实上,这个下标 i i i,只是表示我们在不同的样本空间里罢了)表示最后字符为 y y y,当前这种字符有 i i i 个,步数的期望。这是条件期望。若设 O P T ∣ T OPT|T OPTT 为此次操作的随机变量(当然,是在事件 T T T 发生的大前提下),则由全期望公式,
E i [ X ∣ T ] = ∑ o p t P i ( ( O P T ∣ T ) = o p t ) E i [ ( X ∣ T ) ∣ ( O P T ∣ T ) ] = 1 + ∑ o p t P i ( O P T = o p t , T ) P ( T ) E n e x t ( i , O P T ) [ X ∣ T ] E_i[X|T]=\sum_{opt} P_i((OPT|T)=opt)E_i[(X|T)|(OPT|T)] \\ = 1+\sum_{opt} \frac{P_i(OPT=opt,T)}{P(T)} E_{next(i,OPT)}[X|T] \\ Ei[XT]=optPi((OPTT)=opt)Ei[(XT)(OPTT)]=1+optP(T)Pi(OPT=opt,T)Enext(i,OPT)[XT]
(第 3 步使用条件概率公式

(重要) P i ( O P T = o p t , T ) P_i(OPT=opt,T) Pi(OPT=opt,T) 是什么?它的意思是做完这个操作后这个字符能作为最后字符,所以是 P ( O P T = o p t ) × n e x t ( i , O P T ) n P(OPT=opt)\times \frac{next(i,OPT)}{n} P(OPT=opt)×nnext(i,OPT)

因此,上式化为
E i [ X ∣ T ] = 1 + i ( n − i ) n ( n − 1 ) i − 1 i E i − 1 [ X ∣ T ] + i ( n − i ) n ( n − 1 ) i + 1 i E i + 1 [ X ∣ T ] + ( 1 − 2 i ( n − i ) n ( n − 1 ) ) E i [ X ∣ T ] E_i[X|T]=1+\frac{i(n-i)}{n(n-1)} \frac{i-1}{i} E_{i-1}[X|T]+\frac{i(n-i)}{n(n-1)} \frac{i+1}{i} E_{i+1}[X|T]+\left(1 - \frac{2i(n-i)}{n(n-1)} \right) E_i[X|T] Ei[XT]=1+n(n1)i(ni)ii1Ei1[XT]+n(n1)i(ni)ii+1Ei+1[XT]+(1n(n1)2i(ni))Ei[XT]
故而
E i [ X ∣ T ] = n ( n − 1 ) 2 i ( n − i ) + i − 1 2 i E i − 1 [ X ∣ T ] + i + 1 2 i E i + 1 [ X ∣ T ] E_i[X|T]=\frac{n(n-1)}{2i(n-i)}+\frac{i-1}{2i}E_{i-1}[X|T]+\frac{i+1}{2i}E_{i+1}[X|T] Ei[XT]=2i(ni)n(n1)+2ii1Ei1[XT]+2ii+1Ei+1[XT]

实现

f i = E i [ X ∣ T ] f_i=E_i[X|T] fi=Ei[XT],则 f i = n ( n − 1 ) 2 i ( n − i ) + i − 1 2 i f i − 1 + i + 1 2 i f i + 1 f_i=\frac{n(n-1)}{2i(n-i)}+\frac{i-1}{2i}f_{i-1}+\frac{i+1}{2i}f_{i+1} fi=2i(ni)n(n1)+2ii1fi1+2ii+1fi+1。边界 f 0 = ? , f n = 0 f_0=?, f_n=0 f0=?,fn=0。( f 0 f_0 f0 是未定义的,但没关系,因为 f 1 f_1 f1 的式子中 f 0 f_0 f0 的系数是 0 0 0)。

答案为 ∑ i = 1 ∑ c n t i n f c n t i \sum\limits_{i=1}^{\sum} \frac{cnt_i}{n} f_{cnt_i} i=1ncntifcnti

现在的问题是求出 f i f_i fi,我们待定 f n − 1 f_{n-1} fn1,将所有数都表示为关于 f n − 1 f_{n-1} fn1 的一次函数,此时还未使用 f 1 f_1 f1 的式子,用它来算出 f n − 1 f_{n-1} fn1 的值即可。

时间复杂度 O ( n ) O(n) O(n)

我未解决的问题

样本空间是什么?如果说是操作序列的话,样本空间岂不就是无限集,那么这就不是古典概型了?

代码

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int MAXN = 100005;
int N, buc[30]; char S[MAXN]; double f[MAXN], a[MAXN], b[MAXN], ans;
int main() {
    scanf("%s", S + 1), N = strlen(S + 1); int i;
    for (i = 1; i <= N; ++i) ++buc[S[i] - 'A'];
    a[N - 1] = 1;
    for (i = N - 1; i >= 2; --i) {
        a[i - 1] = a[i] * 2 * i / (i - 1) - a[i + 1] * (i + 1) / (i - 1),
        b[i - 1] = b[i] * 2 * i / (i - 1) - b[i + 1] * (i + 1) / (i - 1) - (double)N * (N - 1) / (ll)((i - 1) * (N - i));
    }
    f[N - 1] = (N / 2.0 + b[2] - b[1]) / (a[1] - a[2]);
    for (i = 1; i <= N - 2; ++i) f[i] = a[i] * f[N - 1] + b[i];
    for (i = 0; i < 26; ++i) ans += f[buc[i]] * buc[i] / N;
    printf("%.1f\n", ans);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值