#P14618. [IATI2022 day2]fork
[IATI2022 day2]fork
题目描述
Luca 打开了一个 Python Shell(交互式解释器),并输入了 os.fork(),于是系统启动了第二个 shell。
从此之后,Luca 每按下一次键盘,按键都会随机发送到两个 shell 之一:
- 以概率 发送到左边的 shell;
- 以概率 发送到右边的 shell。
Luca 可以看到终端,因此每次按键之后,他都知道这次按键究竟落到了哪个 shell 上。
每个 shell 都维护一个输入串,按键会修改对应 shell 的输入串。Luca 的键盘上有:
- 个字符键,这些字符两两不同;
- 一个退格键
Backspace。
按键规则如下:
- 如果某次按下的是字符键,并且该按键被发送到某个 shell,那么这个字符会被追加到该 shell 当前输入串的末尾。
- 如果某次按下的是
Backspace,并且它被发送到某个 shell,那么该 shell 当前输入串的最后一个字符会被删除。 - 如果该 shell 的输入串为空,而此时
Backspace被发送到它,那么什么都不会发生(不过 Luca 仍然能看到这次Backspace发到了哪个 shell)。
Luca 想让两个 shell 最终都输入出同一个固定字符串:
其中 两两不同。
现在 Luca 已经在左边 shell 中正确输入了前 个字符,在右边 shell 中正确输入了前 个字符。也就是说,当前两个 shell 中的字符串分别是:
- 左边:
- 右边:
例如,当 时,目标串可以是 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 | |
总共用了 次按键。
我们称某个 shell 中的一个字符为错误字符,如果无论如何,想要让两个 shell 最终都恰好变成目标串,就必须在某个时刻把这个字符删掉。
Luca 决定采用如下限制策略:
- 如果当前两个 shell 中都没有错误字符,那么他绝不会按
Backspace。 - 他绝不会按一个一定会产生错误字符的按键。
在这些限制下,Luca 想知道:达到目标状态所需按键次数的最小期望值是多少。
请你求出这个最小期望。
输入格式
输入只有一行,包含四个数:
P N L R
含义分别为按键发往左侧 shell 的概率、目标串长度、左侧当前正确前缀长度、右侧当前正确前缀长度。
输出格式
输出一行一个实数,表示最小期望按键次数。
答案需要满足相对误差不超过 。
数据范围
子任务
| 子任务 | 分值 | |
|---|---|---|
| 1 | 5 | 15 |
| 2 | 15 | 10 |
| 3 | 35 | |
| 4 | 100 | 15 |
| 5 | 450 | |
| 6 | 1500 | |
| 7 | ||
| 8 | 5 |
只有通过某个子任务及其之前所有子任务,才能获得该子任务的分数。
误差要求
你的输出必须满足:
$$\frac{|\text{yourAns}-\text{trueAns}|}{\text{trueAns}} \le 10^{-8}$$并约定:
样例
输入
0.3 2 0 1
输出
16.7142857142857