TG Day 2 T1

[Problem]\color{blue}{\texttt{[Problem]}}[Problem]

  • 您先有 000 颗星,您想要有 nnn 颗星
  • 假如您现在有 iii 颗星,每玩一局游戏您有 piqi\dfrac{p_{i}}{q_{i}}qi​pi​​ 的概率变成 i+1i+1i+1 颗星,(1−piqi)\left (1-\dfrac{p_{i}}{q_{i}}\right )(1−qi​pi​​) 的概率变成 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} fn​fi​f0​​=0=(1−qi​pi​​)×fi−1​+qi​pi​​×fi+1​+1(1≤i<n)=(1−q0​p0​​)×f0​+q0​p0​​×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} q0​p0​​f0​→f0​​=q0​p0​​f1​+1=f1​+p0​q0​​​

把 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−q1​p1​​)×(f1​+p0​q0​​)+q1​p1​​×f2​+1=f2​+(1−q1​p1​​)×p0​×p1​q0​×q1​​+p1​q1​​​

同理,再把 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−q1​p1​​)(1−q2​p2​​)×p0​p1​p2​q0​q1​q2​​+(1−q2​p2​​)×p1​p2​q1​q2​​+p2​q2​​

于是我们可以大胆猜测无需证明(其实也可以证明):

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−qk​pk​​)pk−1​qk−1​​⎦⎤​⎭⎬⎫​×pi​qi​​+pi​qi​​

直接算是 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−qk​pk​​)pk−1​qk−1​​k=j∏n​(1−qk​pk​​)pk−1​qk−1​​​⎦⎥⎥⎥⎤​+1⎭⎪⎪⎪⎬⎪⎪⎪⎫​×pi​qi​​

于是我们可以用前缀和和后缀积算法把整个时间复杂度优化到 O(n×log⁡n)O(n\times \log n)O(n×logn),那个 log⁡\loglog 是因为需要用快速幂算逆元。

有个问题是 pnqn\dfrac{p_n}{q_n}qn​pn​​ 不知道,既然目标就是 nnn 颗星,那么就达到 nnn 颗星后就没有概率再网上了,于是 pnqn=0\dfrac{p_n}{q_n}=0qn​pn​​=0,则 1−pnqn=11-\dfrac{p_n}{q_n}=11−qn​pn​​=1。

为了快,可以提前算出 1−pkqk1-\dfrac{p_k}{q_k}1−qk​pk​​ 和 qk−1pk−1\dfrac{q_{k-1}}{p_{k-1}}pk−1​qk−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 好题记 第一记相关推荐

  1. [2021.1.17多校省选模拟4]T1(莫比乌斯反演/组合数学/枚举倍数)

    [2021.1.17多校省选模拟4]T1 一般人都会想着去枚举直线的斜率,但是枚举斜率之后就会产生多条直线,并且这些直线的长度不一,难以快速求解,所以我们考虑换一种方法枚举. 枚举最远点对的横纵坐标之 ...

  2. Java入门篇 2021/02/22

    Java入门篇 2021/02/22 Java的三大版本 java三大版本主要包括 JavaSE, JavaME, JavaEE,其中现如今的JavaME已经是很少见了,JavaSE是JavaEE的基 ...

  3. 2012.02.17

    A^B,这里^的功能为: 例如:0x44^0x33=0100 0100 ^ 0011 0011=0111 0111=0x77 写就是相同为比较,如果同,则0,异,则1 0100 0100 0011 0 ...

  4. 2021.03.17 pokémon小游戏开发记录与周总结

    2021.03.17 pokémon小游戏开发记录与周总结 此篇仅包含部分项目代码,只是个人的学习总结. 文章目录 2021.03.17 pokémon小游戏开发记录与周总结 前言 一.前期准备 二. ...

  5. 【每日一知】带你走近5nm芯片 (2021.02.05 )

    [每日一知]带你走近5nm芯片 (2021.02.05 ) [每日一知]带你走近5nm芯片 (2021.02.05 ) ==一.简介== ==二.优势== ==三.现状== ============= ...

  6. Java SQL异常:java.sql.SQLException: Incorrect DATE value: ‘2021.02.31‘

    报错信息: Cause: java.sql.SQLException: Incorrect DATE value: '2021.02.31' ; uncategorized SQLException; ...

  7. AWD平台搭建(Cardinal 从零开始) 2021/11/17

    #Time 2021/11/17 因为之后要在校内组织AWD比赛,所以在github上找了一会,试了试最多star的,虽然说好用但是没有好康的界面,全是一堆代码感觉很枯燥,于是最终还是选择了使用Car ...

  8. Deepin 深度系统更新(2021.02.03)发布

    深度操作系统更新发布 11031.002(build),升级全新内核到 Kernel 5.10(Stable)版本.更新仓库到 Debian10.7,增强系统稳定性和兼容性.针对系统安全性.硬件驱动等 ...

  9. deepin Java开发环境搭建和主力使用体验(2021.02更)

    前言: 之所以想体验一下deepin有2点原因 1.美观(是的,没错,就是冲着好看去的)2.流畅(主要是一些编程软件比win下反应更快,体验更好) 成果: 1.UI整体风格我觉得OK(基本不用动手美化 ...

最新文章

  1. IEA:截止2015年全球太阳能光伏装机累计超228GW
  2. 我来告诉你【Redis】入门 一
  3. linux 脚本案例,30个关于Shell脚本的经典案例(上)
  4. BASH启动脚本及其启动顺序
  5. 重磅 !《微信生态运营全景解读白皮书》,10 大热门场景、5 大案例剖析!
  6. java里的字符流_javaIO流中字符流的应用
  7. eclipse报告Plugin execution not covered by lifecycle configuration
  8. java代码耗尽内存_有关Java内存溢出及内存消耗的小知识
  9. 第七次发博不知道用什么标题好
  10. zClock - 置顶时钟, 倒计时, 网速显示
  11. moodle升级完整过程
  12. qt项目出现c4819错误的解决办法
  13. c语言编写conio库函数,c语言库函数头文件注释
  14. 检定规程JJG687- 2008《液态物料定量灌装机》解析
  15. linux内核oom,linux下OOM问题排查 互联网技术圈 互联网技术圈
  16. OpenRefine
  17. 亚马逊云服务(AWS)机器学习服务Amazon SageMaker发力中国
  18. 腾讯地图Api 实现拾取坐标功能示例
  19. 电脑技巧:Win7、Win10、Win11如何选择,看完你就懂了
  20. 基于jsp+java+ssm妇女联合会管理系统-计算机毕业设计

热门文章

  1. 【时序异常检测翻译】1.DeepAnT: A Deep Learning Approach for Unsupervised Anomaly Detection in Time Series
  2. Win7 运行bat批处理文件时怎么隐藏cmd命令提示符窗口
  3. BlackHoleDAO能否点燃DeFi3.0用户激情
  4. Shader小技巧-翻转uv
  5. 计算机为什么要学16进制,为什么人们通常用十六进制而不是二进制写计算机
  6. 短线王的盯盘宝怎么样_短线王炒股十大技巧!
  7. JavaScript 进阶篇的学习~
  8. 2015_12_27微软校园招聘笔试题目
  9. 互联网并发与安全系列教程(07) - 常见的Web安全漏洞(其它漏洞)
  10. 自动复制 JavaScript 脚本,JavaScript点击任意位置复制脚本源码