题目大意

  有一条很长很长的路(出题人的套路),你在\(0\)位置,你要去\(h\)位置。

​  路上有一些不同的位置上有敌人,你要和他战斗,你有\(p\)的概率赢。若你赢,则你可以走过去,否则你会死。还有很多个重生点。你每经过一个重生点有\(p\)的概率插旗。你死亡后你会在最后一个插旗的位置重生,然后该位置的旗子消失。如果没有旗子,则你在\(0\)位置重生。

​  求你走到目的地的期望路程。模\({10}^9+7\)

​  \(n\leq 100000\)

题解

​  这道题我用的式子和题解的不一样,最后推出来同一个式子。

​  设\(E_i=\)第\(i\)段的期望通过次数,\(f_i=\)结算完第\(i\)个事件后不回到第\(i\)个点直接到达终点的概率。

​  根据期望与概率的关系,有:\(E_i=\frac1{f_i}\)

​  设\(p=\frac{a_{i+1}}{b_{i+1}}\)(即下一个事件发生的概率)

​  若下一个事件是'\(X\)'(敌人):

\[f_i=pf_{i+1}
\]

\[\frac1{E_i}=\frac1{pE_{i+1}}
\]

\[E_i=\frac{E_{i+1}}p
\]

​  若下一个事件是'\(F\)'(重生点):

\[f_i=f_{i+1}(1+p(1-f_{i+1})+p^2{(1-f_{i+1})}^2+\cdots)=f_{i+1}\frac1{1-p(1-f_{i+1})}=f_{i+1}\frac1{1-p+pf_{i+1}}
\]

​  (第一次成功+第一次插旗&失败&第二次成功+前两次插旗&失败&第三次成功...)

\[\frac1{E_i}=\frac1{E_{i+1}}\frac1{1-p+p\frac1{E_{i+1}}}
\]

\[\frac1{E_i}=\frac1{E_{i+1}-pE_{i+1}+p}
\]

\[E_i=(1-p)E_{i+1}+p
\]

  然后把期望通过次数\(\times\)这段的长度加起来就好了。

​  时间复杂度:\(O(n)\)

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll p=1000000007;
ll fp(ll a,ll b)
{
ll s=1;
while(b)
{
if(b&1)
s=s*a%p;
a=a*a%p;
b>>=1;
}
return s;
}
ll c[100010],a[100010],b[100010],d[100010];
ll f[100010];
int main()
{
ll h,n;
scanf("%lld%lld",&h,&n);
int i;
char s[10];
for(i=1;i<=n;i++)
{
scanf("%s",s);
if(s[0]=='X')
c[i]=1;
else
c[i]=2;
scanf("%lld%lld%lld",&d[i],&a[i],&b[i]);
a[i]=a[i]*fp(b[i],p-2)%p;
}
f[n]=1;
for(i=n;i>=1;i--)
if(c[i]==1)
f[i-1]=f[i]*fp(a[i],p-2)%p;
else
f[i-1]=((1-a[i]+p)%p*f[i]%p+a[i])%p;
d[0]=0;
d[n+1]=h;
ll ans=0;
for(i=0;i<=n;i++)
ans=(ans+(d[i+1]-d[i])%p*f[i]%p+p)%p;
printf("%lld\n",ans);
return 0;
}

【XSY1528】azelso 概率&期望DP的更多相关文章

  1. (2016北京集训十)【xsy1528】azelso - 概率期望dp

    北京集训的题都是好题啊~~(于是我爆0了) 注意到一个重要的性质就是期望是线性的,也就是说每一段的期望步数可以直接加起来,那么dp求出每一段的期望就行了... 设$f_i$表示从$i$出发不回到$i$ ...

  2. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  3. 【bzoj4832】[Lydsy2017年4月月赛]抵制克苏恩 概率期望dp

    题目描述 你分别有a.b.c个血量为1.2.3的奴隶主,假设英雄血量无限,问:如果对面下出一个K点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输入 输入包含多局游戏. 第一行包含一个整数 T (T ...

  4. 【loj6191】「美团 CodeM 复赛」配对游戏 概率期望dp

    题目描述 n次向一个栈中加入0或1中随机1个,如果一次加入0时栈顶元素为1,则将这两个元素弹栈.问最终栈中元素个数的期望是多少. 输入 一行一个正整数 n . 输出 一行一个实数,表示期望剩下的人数, ...

  5. Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

    一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...

  6. 概率期望dp

    对于概率dp,我一直都弄得不是特别明白,虽然以前也有为了考试去突击过,但是终究还是掌握得不是很好,所以决定再去学习一遍,把重要的东西记录下来. 1.hdu4405 Description 在一个 \( ...

  7. Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)

    题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾 ...

  8. [BZOJ4832]抵制克苏恩(概率期望DP)

    方法一:倒推,最常规的期望DP.f[i][a][b][c]表示还要再攻击k次,目前三种随从个数分别为a,b,c的期望攻击英雄次数,直接转移即可. #include<cstdio> #inc ...

  9. LightOJ 1030 Discovering Gold (概率/期望DP)

    题目链接:LightOJ - 1030 Description You are in a cave, a long cave! The cave can be represented by a \(1 ...

随机推荐

  1. Logstash filter 的使用

    原文地址:http://techlog.cn/article/list/10182917 概述 logstash 之所以强大和流行,与其丰富的过滤器插件是分不开的 过滤器提供的并不单单是过滤的功能,还 ...

  2. H5 70-清除浮动方式五

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. WinForm 进度条

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. 第五章 动态SQL 批量操作

    用于实现动态SQL的元素主要有 if trim where set choose(when.otherwise) foreach MyBatis  缓存 一级缓存 在test类中 调用相同的方法 第二 ...

  5. Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试

    近来发现两个问题: 1.jenkins设置邮箱时邮件发送测试不成功,之前是成功的: 2.启动python服务时,使用8000端口报错,但是用其他端口可用: 百度了一下,原来是端口占用的问题,可用如下方 ...

  6. VS如何在调试时进入到dll文件

    背景:    项目A:用C#写的一个类库文件 项目B:引用项目A的dll文件,完成编码,也是C#编写的. 需求:怎么能在调试的时候,调试断点能够从项目B中进入项目A中的代码. 解决办法就是: 假设,项 ...

  7. IdentityServer4【QuickStart】之利用OpenID Connect添加用户认证

    利用OpenID Connect添加用户认证 利用OpenID Connect添加用户认证 在这个示例中我们想要通过OpenID Connect协议将交互用户添加到我们的IdentityServer上 ...

  8. [转帖]2015年时微软Win3.1崩溃迫使巴黎奥利机场短暂关闭

    https://www.ithome.com/html/it/188796.htm IT之家讯 2015年11月14日消息,上周法国巴黎奥利机场因为微软的Windows 3.1系统出现故障不得不迫使所 ...

  9. Laravel技巧:使用load、with预加载 区别

    1.使用load $posts = Post::all(); $posts->load('user'); 2.使用with $posts = Post::with('user')->all ...

  10. 前K个高频元素

    给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], ...