2021.02.17 GDKOI2021 好题记 第一记
TG Day 2 T1
[Problem]\color{blue}{\texttt{[Problem]}}[Problem]
- 您先有 000 颗星,您想要有 nnn 颗星
- 假如您现在有 iii 颗星,每玩一局游戏您有 piqi\dfrac{p_{i}}{q_{i}}qipi 的概率变成 i+1i+1i+1 颗星,(1−piqi)\left (1-\dfrac{p_{i}}{q_{i}}\right )(1−qipi) 的概率变成 i−1i-1i−1 颗星。
- 您最少只会有 000 颗星。
- 问期望下要玩几局?输出答案对 998244353998244353998244353 取模的结果。
- 1≤n≤1×1061 \leq n \leq 1 \times 10^61≤n≤1×106。
[Solution]\color{blue}{\texttt{[Solution]}}[Solution]
记 fif_{i}fi 表示已经有了 iii 颗星,期望还需要玩 fif_{i}fi 局才能拿到 nnn 颗星。
显然有如下转移:
fn=0fi=(1−piqi)×fi−1+piqi×fi+1+1(1≤i<n)f0=(1−p0q0)×f0+p0q0×f1+1\begin{aligned} f_n&=0\\ f_{i}&=\left (1-\dfrac{p_i}{q_i} \right )\times f_{i-1}+\dfrac{p_i}{q_i}\times f_{i+1}+1(1 \leq i < n)\\ f_{0}&=\left ( 1- \dfrac{p_0}{q_0}\right )\times f_0 +\dfrac{p_0}{q_0} \times f_{1}+1 \end{aligned} fnfif0=0=(1−qipi)×fi−1+qipi×fi+1+1(1≤i<n)=(1−q0p0)×f0+q0p0×f1+1
化简 f0f_0f0 的式子,我们可以有:
p0q0f0=p0q0f1+1→f0=f1+q0p0\begin{aligned} \dfrac{p_0}{q_0}f_0&=\dfrac{p_0}{q_0}f_1+1\\ \to f_0&=f_1+\dfrac{q_0}{p_0} \end{aligned} q0p0f0→f0=q0p0f1+1=f1+p0q0
把 f0f_0f0 再代入 f1f_1f1 的式子中,有:
f1=(1−p1q1)×(f1+q0p0)+p1q1×f2+1→f1=f2+(1−p1q1)×q0×q1p0×p1+q1p1\begin{aligned} f_1 &= \left ( 1-\dfrac{p_1}{q_1}\right )\times \left ( f_1+\dfrac{q_0}{p_0}\right )+\dfrac{p_1}{q_1} \times f_{2}+1\\ \to f_1 &= f_2 + \left ( 1-\dfrac{p_1}{q_1}\right )\times \dfrac{q_0 \times q_1}{p_0\times p_1}+\dfrac{q_1}{p_1} \end{aligned} f1→f1=(1−q1p1)×(f1+p0q0)+q1p1×f2+1=f2+(1−q1p1)×p0×p1q0×q1+p1q1
同理,再把 f1f_1f1 代入 f2f_2f2 中,有(推导省略):
f2=f3+(1−p1q1)(1−p2q2)×q0q1q2p0p1p2+(1−p2q2)×q1q2p1p2+q2p2f_2=f_3+\left (1- \dfrac{p_1}{q_1} \right )\left ( 1-\dfrac{p_2}{q_2} \right )\times \dfrac{q_0q_1q_2}{p_0p_1p_2}+\left ( 1-\dfrac{p_2}{q_2}\right ) \times \dfrac{q_1q_2}{p_1p_2}+\dfrac{q_2}{p_2}f2=f3+(1−q1p1)(1−q2p2)×p0p1p2q0q1q2+(1−q2p2)×p1p2q1q2+p2q2
于是我们可以大胆猜测无需证明(其实也可以证明):
fi=fi+1+{∑j=1i[∏k=ji(1−pkqk)qk−1pk−1]}×qipi+qipif_{i}=f_{i+1}+ \left \{ \sum\limits_{j=1}^{i}\left [ \prod\limits_{k=j}^{i} \left (1-\dfrac{p_k}{q_k} \right )\dfrac{q_{k-1}}{p_{k-1}}\right ]\right \}\times \dfrac{q_{i}}{p_i}+\dfrac{q_{i}}{p_i}fi=fi+1+⎩⎨⎧j=1∑i⎣⎡k=j∏i(1−qkpk)pk−1qk−1⎦⎤⎭⎬⎫×piqi+piqi
直接算是 O(n3)O(n^3)O(n3) 的,考虑如何优化。
改写式子:
fi=fi+1+{∑j=1i[∏k=jn(1−pkqk)qk−1pk−1∏k=i+1n(1−pkqk)qk−1pk−1]+1}×qipif_{i}=f_{i+1} + \left \{ \sum\limits_{j=1}^{i}\left [ \dfrac{\prod\limits_{k=j}^{n} \left (1-\dfrac{p_k}{q_k} \right )\dfrac{q_{k-1}}{p_{k-1}}}{ \prod\limits_{k=i+1}^{n} \left (1-\dfrac{p_k}{q_k} \right )\dfrac{q_{k-1}}{p_{k-1}}}\right ] +1\right \} \times \dfrac{q_{i}}{p_{i}}fi=fi+1+⎩⎪⎪⎪⎨⎪⎪⎪⎧j=1∑i⎣⎢⎢⎢⎡k=i+1∏n(1−qkpk)pk−1qk−1k=j∏n(1−qkpk)pk−1qk−1⎦⎥⎥⎥⎤+1⎭⎪⎪⎪⎬⎪⎪⎪⎫×piqi
于是我们可以用前缀和和后缀积算法把整个时间复杂度优化到 O(n×logn)O(n\times \log n)O(n×logn),那个 log\loglog 是因为需要用快速幂算逆元。
有个问题是 pnqn\dfrac{p_n}{q_n}qnpn 不知道,既然目标就是 nnn 颗星,那么就达到 nnn 颗星后就没有概率再网上了,于是 pnqn=0\dfrac{p_n}{q_n}=0qnpn=0,则 1−pnqn=11-\dfrac{p_n}{q_n}=11−qnpn=1。
为了快,可以提前算出 1−pkqk1-\dfrac{p_k}{q_k}1−qkpk 和 qk−1pk−1\dfrac{q_{k-1}}{p_{k-1}}pk−1qk−1 对 998244353998244353998244353 取模的值。
这题到这里就算搞定了,出题人的定义是简单推式子。
[code]\color{blue}{\texttt{[code]}}[code]
const int N=1e6+100;
const int mod=998244353;
inline int ksm(int a,int b){register int ret=1;while (b){if (b&1) ret=1ll*ret*a%mod;a=1ll*a*a%mod;b>>=1;}return ret;
}
int suf[N],n,p[N],q[N],f[N],pre[N];
int main(){freopen("game.in","r",stdin);freopen("game.out","w",stdout);n=read();f[n]=0;//initfor(int i=0,x,y;i<n;i++){x=read();y=read();p[i]=1ll*ksm(x,mod-2)*y%mod;q[i]=1ll*(y-x+mod)%mod*ksm(y,mod-2)%mod;}q[n]=1;suf[n]=1;for(int i=n-1;i>=1;i--)suf[i]=1ll*suf[i+1]*q[i]%mod*p[i-1]%mod;for(int i=1,sum=0;i<n;i++){sum=(1ll*sum+suf[i])%mod;pre[i]=1ll*sum*p[i]%mod*ksm(suf[i+1],mod-2)%mod;}for(int i=n-1;i>=0;i--)f[i]=((1ll*f[i+1]+pre[i])%mod+p[i])%mod;printf("%d",f[0]);return 0;
}
//By HPXXZYY(Yingye Zhu, OZDY)
2021.02.17 GDKOI2021 好题记 第一记相关推荐
- [2021.1.17多校省选模拟4]T1(莫比乌斯反演/组合数学/枚举倍数)
[2021.1.17多校省选模拟4]T1 一般人都会想着去枚举直线的斜率,但是枚举斜率之后就会产生多条直线,并且这些直线的长度不一,难以快速求解,所以我们考虑换一种方法枚举. 枚举最远点对的横纵坐标之 ...
- Java入门篇 2021/02/22
Java入门篇 2021/02/22 Java的三大版本 java三大版本主要包括 JavaSE, JavaME, JavaEE,其中现如今的JavaME已经是很少见了,JavaSE是JavaEE的基 ...
- 2012.02.17
A^B,这里^的功能为: 例如:0x44^0x33=0100 0100 ^ 0011 0011=0111 0111=0x77 写就是相同为比较,如果同,则0,异,则1 0100 0100 0011 0 ...
- 2021.03.17 pokémon小游戏开发记录与周总结
2021.03.17 pokémon小游戏开发记录与周总结 此篇仅包含部分项目代码,只是个人的学习总结. 文章目录 2021.03.17 pokémon小游戏开发记录与周总结 前言 一.前期准备 二. ...
- 【每日一知】带你走近5nm芯片 (2021.02.05 )
[每日一知]带你走近5nm芯片 (2021.02.05 ) [每日一知]带你走近5nm芯片 (2021.02.05 ) ==一.简介== ==二.优势== ==三.现状== ============= ...
- Java SQL异常:java.sql.SQLException: Incorrect DATE value: ‘2021.02.31‘
报错信息: Cause: java.sql.SQLException: Incorrect DATE value: '2021.02.31' ; uncategorized SQLException; ...
- AWD平台搭建(Cardinal 从零开始) 2021/11/17
#Time 2021/11/17 因为之后要在校内组织AWD比赛,所以在github上找了一会,试了试最多star的,虽然说好用但是没有好康的界面,全是一堆代码感觉很枯燥,于是最终还是选择了使用Car ...
- Deepin 深度系统更新(2021.02.03)发布
深度操作系统更新发布 11031.002(build),升级全新内核到 Kernel 5.10(Stable)版本.更新仓库到 Debian10.7,增强系统稳定性和兼容性.针对系统安全性.硬件驱动等 ...
- deepin Java开发环境搭建和主力使用体验(2021.02更)
前言: 之所以想体验一下deepin有2点原因 1.美观(是的,没错,就是冲着好看去的)2.流畅(主要是一些编程软件比win下反应更快,体验更好) 成果: 1.UI整体风格我觉得OK(基本不用动手美化 ...
最新文章
- IEA:截止2015年全球太阳能光伏装机累计超228GW
- 我来告诉你【Redis】入门 一
- linux 脚本案例,30个关于Shell脚本的经典案例(上)
- BASH启动脚本及其启动顺序
- 重磅 !《微信生态运营全景解读白皮书》,10 大热门场景、5 大案例剖析!
- java里的字符流_javaIO流中字符流的应用
- eclipse报告Plugin execution not covered by lifecycle configuration
- java代码耗尽内存_有关Java内存溢出及内存消耗的小知识
- 第七次发博不知道用什么标题好
- zClock - 置顶时钟, 倒计时, 网速显示
- moodle升级完整过程
- qt项目出现c4819错误的解决办法
- c语言编写conio库函数,c语言库函数头文件注释
- 检定规程JJG687- 2008《液态物料定量灌装机》解析
- linux内核oom,linux下OOM问题排查 互联网技术圈 互联网技术圈
- OpenRefine
- 亚马逊云服务(AWS)机器学习服务Amazon SageMaker发力中国
- 腾讯地图Api 实现拾取坐标功能示例
- 电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
- 基于jsp+java+ssm妇女联合会管理系统-计算机毕业设计
热门文章
- 【时序异常检测翻译】1.DeepAnT: A Deep Learning Approach for Unsupervised Anomaly Detection in Time Series
- Win7 运行bat批处理文件时怎么隐藏cmd命令提示符窗口
- BlackHoleDAO能否点燃DeFi3.0用户激情
- Shader小技巧-翻转uv
- 计算机为什么要学16进制,为什么人们通常用十六进制而不是二进制写计算机
- 短线王的盯盘宝怎么样_短线王炒股十大技巧!
- JavaScript 进阶篇的学习~
- 2015_12_27微软校园招聘笔试题目
- 互联网并发与安全系列教程(07) - 常见的Web安全漏洞(其它漏洞)
- 自动复制 JavaScript 脚本,JavaScript点击任意位置复制脚本源码