Solution -「多校联训」光影交错
\(\mathcal{Description}\)
Link.
一个游戏包含若干次卡牌抽取,每次以 \(p_l\) 的概率得到 \(+1\),\(p_d\) 的概率得到 \(-1\),否则得到 \(0\),操作后以 \(p\) 的概率结束游戏,求每次抽取后,满足 \(+1\) 数量大于 \(-1\) 数量的抽取轮数的期望值。不取模。
\(0<p\le1\),\(0\le p_l,p_d,p_l+p_d\le 1\)。
\(\mathcal{Solution}\)
我请愿为Tiw 太阳神教的教徒。(
令 \(p_e=1-p_l-p_r\),表示得到 \(0\) 的概率。我们直接从答案 \(\mathcal A\) 入手:
\]
即枚举一个抽取后(不一定结束)的状态。此后,把 \((1-p)\) 的指数分配到其余三个因子上,令
p_e'=p_e(1-p)\\
p_l'=p_l(1-p)\\
p_d'=p_d(1-p)
\end{cases},
\]
带入 \(\mathcal{A}\),同时发现 \(e\) 的限制较少,所以单独枚举 \(e\),有
\mathcal{A} &=\frac{1}{1-p} \sum_{l>d\ge0,e\ge0} \binom{l+d+e}{l,d,e}p_e'^ep_d'^dp_l'^l\\
&= \frac{1}{1-p} \sum_{l\ge d\ge 0} \binom{l+d}{d} p_l'^lp_d'^d \sum_{e\ge 0}\binom{l+d+e}{e}p_e'^e.
\end{aligned}
\]
最后的级数形如 \(\sum_{i\ge 0}\binom{i+t}{i}x^i=\frac{1}{(1-x)^t}\),当 \(p_e=1\) 时认为 \(\frac{1}{0^0}=1\),即任意 \(p_e\) 在这个 GF 的收敛域中,可以直接带入。所以
\]
按照先前的套路分配指数,再令
p_l''=\frac{p_l'}{1-p_e'}\\
p_d''=\frac{p_d'}{1-p_e'}
\end{cases},
\]
代入整理,得到
\]
我们固定 \(l\),挑出此时 \(d\) 的和式来研究,记
\]
错位相减,左右乘 \((1-p_d'')\),对齐求和指标 \(d\) 以化简,最终得到
\]
令 \(a_l=\binom{2(l-1)}{l-1}p_d''^{l-1}-\binom{2l-1}{l-1}p_d''^l\),自然得到
\]
代回 \(\mathcal{A}\),交换求和指标并分配 \((1-p_d'')^{l-i+1}\) 的指数:
\mathcal{A} &= \frac{1}{(1-p)(1-p_e')} \sum_{l\ge0} p_l''^l \sum_{i=1}^l \frac{a_i}{(1-p_d'')^{l-i+1}} \\
&= \frac{1}{(1-p)(1-p_e')} \sum_{i\ge1} \frac{a_i}{(1-p_d'')^{-i+1}} \sum_{l\ge i} \left(\frac{p_l''}{1-p_d''}\right)^l.
\end{aligned}
\]
注意到最后的级数是等比数列求和,先考虑它的收敛性:
1-p_d''-p_l'' &= 1-\frac{(1-p)p_d+(1-p)p_l}{1-(1-p)p_e} \\
&= \frac{1-(1-p)p_e-(1-p)p_d-(1-p)p_l}{1-(1-p)p_e} \\
&= \frac{p}{1-(1-p)p_e} \\
&>0.
\end{aligned}
\]
收敛啦。不妨令 \(q=\frac{p_l''}{1-p_d''}\),整理式子:
\mathcal{A} &= \frac{1}{(1-p)(1-p_e')} \sum_{i\ge1}\frac{a_i}{(1-p_e'')^{-i+1}}\cdot \frac{q^i}{1-q} \\
&= \frac{1}{(1-p)(1-p_e')(1-q)} \sum_{i\ge1} q^i \left\{ \binom{2(i-1)}{i-1}[p_d''(1-p_d'')]^{i-1} - p_d''\binom{2i-1}{i-1}[p_d''(1-p_d'')]^{i-1} \right\} \\
&= \frac{q}{(1-p)(1-p_e')(1-q)} \sum_{i\ge1} \left[ \binom{2(i-1)}{i-1}(p_d''p_l'')^{i-1} - p_d''\binom{2i-1}{i-1}(p_d''p_l'')^{i-1} \right].
\end{aligned}
\]
最后的最后,研究级数 \(\sum_{i\ge0}\binom{2i}{i}\) 和 \(\sum_{i\ge0}\binom{2i-1}{i}\)。考虑到 Catalan 数的 GF:
C(x) &= \sum_{i\ge0}\frac{\binom{2i}{i}}{i+1}x^i\\
&= \frac{1-(1-4x)^{\frac{1}{2}}}{2},
\end{aligned}
\]
利用位移和求导消掉分母,得到 \(F(x)=\sum_{i\ge0}\binom{2i}{i}x^i\) 的封闭形式:
\lbrack xC(x)\rbrack' &= \left[ \frac{1-(1-4x)^{\frac{1}{2}}}{2} \right]' \\
&= (1-4x)^{-\frac{1}{2}} \\
&= F(x).
\end{aligned}
\]
接着用 \(F(x)\) 配凑出 \(G(x)=\sum_{i\ge0}\binom{2i}{i+1}x^i\),结果是
\]
将结果代入 \(\mathcal{A}\):
\]
能直接 \(\mathcal O(1)\) 计算啦。顺便检查一下 \((1-4p_d''p_l'')\) 能否开根。注意到 \(p_d''+p_l''\le 1\),所以
p_d''p_l''&\le \frac{(p_l''+p_r'')^2}{4}\\
&\le \frac{1}{4}.
\end{aligned}
\]
能开根,计算即可。注意特判 \(p=1\) 和 \(p_l=0\) 的情况(不然会爆 nan qwq)。
\(\mathcal{Code}\)
/*~Rainybunny~*/
#include <cmath>
#include <cstdio>
#include <cassert>
#define rep( i, l, r ) for ( int i = l, rep##i = r; i <= rep##i; ++i )
#define per( i, r, l ) for ( int i = r, per##i = l; i >= per##i; --i )
const int N = 1e7;
double pl, pd, pe, p, f[N + 5], g[N + 5];
inline void solve() {
if ( p == 1 ) return void( printf( "%.12f\n", pl ) );
if ( pl == 0 ) return void( printf( "%.12f\n", 0. ) );
double c = pe * ( 1 - p ), // pe'
a = ( 1 - p ) * pl / ( 1 - c ), // pl''
b = ( 1 - p ) * pd / ( 1 - c ), // pd''
q = a / ( 1 - b ), r = a * b, // pl''/(1-pd''); pl''pd''
u = 1 / sqrt( 1 - 4 * r );
printf( "%.12f\n", q / ( 1 - p ) / ( 1 - c ) / ( 1 - q )
* ( !a || !b ? 1 : ( u - b / ( 2 * r ) * ( u - 1 ) ) ) );
}
int main() {
freopen( "augury.in", "r", stdin );
freopen( "augury.out", "w", stdout );
int T;
scanf( "%*d %d", &T );
while ( T-- ) {
scanf( "%lf %lf %lf", &pl, &pd, &p ), pe = 1 - pl - pd;
solve();
}
return 0;
}
Solution -「多校联训」光影交错的更多相关文章
- Solution -「多校联训」排水系统
\(\mathcal{Description}\) Link. 在 NOIP 2020 A 的基础上,每条边赋权值 \(a_i\),随机恰好一条边断掉,第 \(i\) 条段的概率正比于 \(a ...
- Solution -「多校联训」I Love Random
\(\mathcal{Description}\) 给定排列 \(\{p_n\}\),可以在其上进行若干次操作,每次选取 \([l,r]\),把其中所有元素变为原区间最小值,求能够得到的所有不同序 ...
- Solution -「多校联训」签到题
\(\mathcal{Description}\) Link. 给定二分图 \(G=(X\cup Y,E)\),求对于边的一个染色 \(f:E\rightarrow\{1,2,\dots,c\ ...
- Solution -「多校联训」朝鲜时蔬
\(\mathcal{Description}\) Link. 破案了,朝鲜时蔬 = 超现实树!(指写得像那什么一样的题面. 对于整数集 \(X\),定义其 好子集 为满足 \(Y\sub ...
- Solution -「多校联训」消失的运算符
\(\mathcal{Description}\) Link. 给定长度为 \(n\) 的合法表达式序列 \(s\),其中数字仅有一位正数,运算符仅有 - 作为占位.求将其中恰好 \(k\) ...
- Solution -「多校联训」假人
\(\mathcal{Description}\) Link. 一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...
- Solution -「多校联训」古老的序列问题
\(\mathcal{Description}\) Link. 给定序列 \(\{a_n\}\),和 \(q\) 次形如 \([L,R]\) 的询问,每次回答 \[\sum_{[l,r]\su ...
- Solution -「多校联训」Sample
\(\mathcal{Description}\) Link (稍作简化:)对于变量 \(p_{1..n}\),满足 \(p_i\in[0,1],~\sum p_i=1\) 时,求 \(\ma ...
- Solution -「多校联训」数学考试
\(\mathcal{Description}\) Link. 给定 \(n\) 个函数,第 \(i\) 个有 \(f_i(x)=a_ix^3+b_ix^2+cx_i+d~(x\in[l_i, ...
随机推荐
- ANT之macrodef
macrodef 的意思是宏定义, 可以理解为自定义函数. 对于大型部署,可以提高代码利用率. 为了方便理解,请看代码示例: <macrodef name="macro-send-fi ...
- 一文搞定 Windows Terminal 设置与 zsh 安装 (非WSL)
为 Windows Terminal 添加标签页 添加 Anaconda 标签页 在settings.json文件中的list列表中添加设置项: { // Make changes here to t ...
- Vulnhub系列:Os-hackNos
0x01环境搭建 靶机链接: https://www.vulnhub.com/entry/hacknos-os-hacknos,401/发布日期: 2019.11.27靶机描述: 描述 难度:容易中级 ...
- Linux防火墙--IPtables企业级配置策略思路
一.防火墙简介 防火墙定义:是通过有机结合各类用于安全管理与筛选的软件和硬件设备,帮助计算机网络于其内.外网之间构建一道相对隔绝的保护屏障,以保护用户资料与信息安全性的一种技术. 防火墙发展应用:最早 ...
- 【分布式技术专题】「Zookeeper中间件」给大家学习一下Zookeeper的”开发伴侣”—Curator-Framework(基础篇)
CuratorFramework基本介绍 CuratorFramework是Netflix公司开源的一套Zookeeper客户端框架,它作为一款优秀的ZooKeeper客户端开源工具,主要提供了对客户 ...
- 论文解读GCN 1st《 Deep Embedding for CUnsupervisedlustering Analysis》
论文信息 Tittle:<Spectral Networks and Locally Connected Networks on Graphs> Authors:Joan Bruna.Wo ...
- Vulnhub - THE PLANETS: EARTH
环境配置 从www.vulnhub.com下载靶机,在VMware中导入,自动分配IP 主机发现 通过对内网主机的扫描,VMware为目标主机 端口扫描 使用nmap对主机进行扫描 发现443端口信息 ...
- [C# 学习]委托和线程
委托有点像C语言的函数指针,简单总结一下如何使用委托. 1. 声明一个委托 public delegate void LabelSetEventHandler(Label la, string str ...
- C# 类的继承问题 正方形周长面积计算问题
1. 设计编写一个控制台应用程序,练习类的继承. (1) 编写一个抽象类 People,具有"姓名","年龄"字段,"姓名"属性,Work ...
- 【记录一个问题】android下的ucontext协程,因为使用栈上的对象,导致cv::Mat被莫名析构
工作的流程是这样:某个协程在栈上创建task对象,在task对象内有需要返回的cv::Mat. 然后把task放到另一个线程上去执行,然后切换到别的协程,等到工作线程执行完task后,再唤醒协程. 这 ...