#P14618. [IATI2022 day2]fork

    ID: 13834 传统题 2000ms 512MiB 尝试: 12 已通过: 1 难度: 7 上传者: 标签>CF2300概率论数学动态规划贪心概率DP记忆化搜索

[IATI2022 day2]fork

题目描述

Luca 打开了一个 Python Shell(交互式解释器),并输入了 os.fork(),于是系统启动了第二个 shell。

从此之后,Luca 每按下一次键盘,按键都会随机发送到两个 shell 之一:

  • 以概率 PP 发送到左边的 shell;
  • 以概率 1P1-P 发送到右边的 shell。

Luca 可以看到终端,因此每次按键之后,他都知道这次按键究竟落到了哪个 shell 上。

每个 shell 都维护一个输入串,按键会修改对应 shell 的输入串。Luca 的键盘上有:

  • NN 个字符键,这些字符两两不同;
  • 一个退格键 Backspace

按键规则如下:

  • 如果某次按下的是字符键,并且该按键被发送到某个 shell,那么这个字符会被追加到该 shell 当前输入串的末尾。
  • 如果某次按下的是 Backspace,并且它被发送到某个 shell,那么该 shell 当前输入串的最后一个字符会被删除。
  • 如果该 shell 的输入串为空,而此时 Backspace 被发送到它,那么什么都不会发生(不过 Luca 仍然能看到这次 Backspace 发到了哪个 shell)。

Luca 想让两个 shell 最终都输入出同一个固定字符串:

a1a2aNa_1a_2\dots a_N

其中 a1,a2,,aNa_1,a_2,\dots,a_N 两两不同。

现在 Luca 已经在左边 shell 中正确输入了前 LL 个字符,在右边 shell 中正确输入了前 RR 个字符。也就是说,当前两个 shell 中的字符串分别是:

  • 左边:a1a2aLa_1a_2\dots a_L
  • 右边:a1a2aRa_1a_2\dots a_R

例如,当 P=0.3, N=2, L=0, R=1P=0.3,\ N=2,\ L=0,\ R=1 时,目标串可以是 ab,一种可能的过程如下:

步数 按键 落点 左侧 shell 右侧 shell
0 - - a
1 b Right ab
2 a aba
3 Left a
4 b Right abab
5 Backspace aba
6 Left -
7
8 Right ab
9 a Left a
10 b Right abb
11 Left ab
12 Backspace Right ab

总共用了 1212 次按键。


我们称某个 shell 中的一个字符为错误字符,如果无论如何,想要让两个 shell 最终都恰好变成目标串,就必须在某个时刻把这个字符删掉。

Luca 决定采用如下限制策略:

  1. 如果当前两个 shell 中都没有错误字符,那么他绝不会按 Backspace
  2. 他绝不会按一个一定会产生错误字符的按键。

在这些限制下,Luca 想知道:达到目标状态所需按键次数的最小期望值是多少。

请你求出这个最小期望。

输入格式

输入只有一行,包含四个数:

P N L R

含义分别为按键发往左侧 shell 的概率、目标串长度、左侧当前正确前缀长度、右侧当前正确前缀长度。

输出格式

输出一行一个实数,表示最小期望按键次数。

答案需要满足相对误差不超过 10810^{-8}

数据范围

  • 0L,RN2×1070\le L,R\le N\le 2\times 10^7
  • 0.1P0.90.1\le P\le 0.9

子任务

子任务 NN\le 分值
1 5 15
2 15 10
3 35
4 100 15
5 450
6 1500
7 10610^6
8 2×1072\times 10^7 5

只有通过某个子任务及其之前所有子任务,才能获得该子任务的分数。

误差要求

你的输出必须满足:

$$\frac{|\text{yourAns}-\text{trueAns}|}{\text{trueAns}} \le 10^{-8}$$

并约定:

00=0\frac{0}{0}=0

样例

输入

0.3 2 0 1

输出

16.7142857142857