[吐槽]

  首先当然是要orzyww啦

  以及orzyxq奇妙顺推很强qwq

  嗯。。怎么说呢虽然说之前零零散散做了一些概d的题目但是总感觉好像并没有弄得比较明白啊。。(我的妈果然蒟蒻)

  这题的话可以说是难得的一道搞得比较清楚的概d题目吧记录一下还是挺有意思的ovo

  当然咯。。显然考场上并没有推出来。。嗯qwq

[题解]

  看到说要求期望的距离,然后总的长度又被分成了一段一段的(各个事件)

  所以就有一个比较直接的想法:将每一段期望走的次数算出来然后再乘上每一段的距离,加起来就是答案啦

  那么现在问题来了怎么求期望走的次数

  

  考虑定义 

       $e_i$:第i个到第i+1个事件中间这段路程的经过次数的期望

  $f_i$:第i个事件发生后走到h,并且i到i+1中间这段路程只经过了一次的概率

  根据定义我们可以得到:

  $e_i=\frac{1}{f_i}$

  (然而为啥要这样搞呢。。嗯个人的理解是如果直接求期望会比较麻烦但是概率的话相对来说比较好写转移方程)

  考虑转移

  【奇妙套路】嗯概d的题目一般反着推会比较友善至于原因是啥。。还得求教各位dalao。。

  所以这题我们也反着推咯

  首先记第i+1个事件发生的概率为p,那么第i+1个事件有两种不同的情况:

  1.打怪

  如果说第i+1个事件要打怪,因为这段只能经过一次,所以显然打怪必须成功

  (否则肯定会回到前面去,那么i到i+1就会经过不止一次了)

  所以得到:i+1=X的话,$f_i=f_{i+1}*p$

  2.插旗

  但是如果说第i+1个事件是插旗,就会比较复杂了

  因为现在只要求i到i+1这段经过1次,对后面的情况并没有限制,所以i+1以及后面的都可以经过很多次

  换句话来说就是:只要第i+1这个位置插旗成功,后面的无论爆炸了多少次都没有关系,因为最前只能回到i+1这个位置

  

  后面被打回来的概率的话,因为被打回来了所以显然i+1到i+2经过了不止一次,那么一次被打回来的概率就是$1-f_{i+1}$

  然后无论被打回来了多少次,最后一次肯定是要走到终点去的,所以最后要乘一个$f_{i+1}$

  

  那么我们就可以得到:

  i+1==F的话$f_i=f_{i+1}+p*(1-f_{i+1})*f_{i+1}+(p*(1-f_{i+1}))^2*f_{i+1}+(p*(1-f_{i+1}))^3*f_{i+1}+...+(p*(1-f_{i+1}))^n*f_{i+1}$

  (爆炸0次+爆炸1次+爆炸2次+...+爆炸n次)

  这里$n\to\infty$

  

  考虑怎么算

  但是发现插旗的情况,式子十分不友善。。所以就整理一下

  先将$f_{i+1}$提出来得到:

  $f_i=f_{i+1}*(1+p*(1-f_{i+1})+(p*(1-f_{i+1}))^2+(p*(1-f_{i+1}))^3+...+(p*(1-f_{i+1}))^n)$

  然后发现后面的一堆其实是这种形式:

  $1+x+x^2+x^3+...+x^n$

  我们记这个式子ans为a

  那么$a*x=x+x^2+x^3+...x^{n-1}$

  两式相减一下整理得到:

  $a=\frac{1-x^n-1}{1-x}$

  注意到,这里我们的x是一个概率,所以是小于1的,而$n\to\infty$,所以$x^{n-1}$是一个特别小的数可以直接忽略

  所以得到:$a=\frac{1}{1-x}$

  (mark:嗯有空可以去研究一下泰勒展开之类的)

  然后就可以带进去算啦,得到:

  $f_i=f_{i+1}*\frac{1}{1-p*(1-f_{i+1})}$

  考虑转成e[i]的转移方程

  手头上两条式子:

  i+1打怪:$f_i=f_{i+1}*p$

  i+1插旗:$f_i=f_{i+1}*\frac{1}{1-p*(1-f_{i+1})}$

  将$e_i=\frac{1}{f_i}$带进去得到:

  打怪:$e_i=\frac{e_{i+1}}{p}$

  插旗:$e_i=(1-p)*e_{i+1}+p$

  随后乘一下什么的算算答案就好

  (所以说为啥这题我写了这么长的题解。。很迷啊。。果然太菜qwq)

[坑点]

  除法的话用逆元就好啦

  但是要多% (不然怕是要被续)

[update]

  今天重新写了一下这道题然后== 弱智二连qwq

  首先第一个是。。在求距离差的时候忘记取模了== 第二个是。。不能直接用$f$(也就是概率)来算,因为。。可能出现被$0$除的情况,所以我们还是需要转成期望来算qwq

  这个故事告诉我们没事不要把算的东西放到分母去搞不好就翻了QwQ

 #include<iostream>
#include<cstdio>
#include<cstring>
#define MOD 1000000007
#define ll long long
using namespace std;
const int MAXN=1e5+;
ll e[MAXN],p[MAXN],dis[MAXN];
char op[MAXN];
ll ans;
ll n,m;
ll ksm(ll x,int b);
ll inv(ll x); int main()
{
char s[];
ll x,y;
scanf("%lld%lld",&n,&m);
for (int i=;i<=m;++i)
{
scanf("%s%lld%lld%lld",s,&dis[i],&x,&y);
x=x%MOD;
y=y%MOD;
p[i]=x*inv(y)%MOD;
op[i]=s[];
}
e[m]=;
for (int i=m-;i>=;--i)
{
if (op[i+]=='X')
e[i]=(e[i+]*inv(p[i+]))%MOD;
else
e[i]=((((+MOD-p[i+])%MOD)*e[i+])%MOD+p[i+])%MOD;
}
dis[]=; dis[m+]=n;
for (int i=;i<=m;++i)
ans=(ans+(((dis[i+]-dis[i])%MOD)*e[i])%MOD)%MOD;
printf("%lld\n",ans);
} ll ksm(ll x,int b)
{
ll ret=,base=x;
while (b)
{
if (b&) ret=(ret*base)%MOD;
base=(base*base)%MOD;
b>>=;
}
return ret;
} ll inv(ll x)
{
return ksm(x,MOD-);
}

【2016北京集训测试赛】azelso的更多相关文章

  1. 2016北京集训测试赛(十)Problem A: azelso

    Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...

  2. 【2016北京集训测试赛(十)】 Azelso (期望DP)

    Time Limit: 1000 ms   Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...

  3. 【2016北京集训测试赛(二)】 thr (树形DP)

    Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...

  4. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

  5. 【2016北京集训测试赛(十六)】 River (最大流)

    Description  Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...

  6. 【2016北京集训测试赛】river

    HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...

  7. [2016北京集训测试赛17]crash的游戏-[组合数+斯特林数+拉格朗日插值]

    Description Solution 核心思想是把组合数当成一个奇怪的多项式,然后拉格朗日插值..:哦对了,还要用到第二类斯特林数(就是把若干个球放到若干个盒子)的一个公式: $x^{n}=\su ...

  8. [2016北京集训测试赛15]statement-[线段树+拆环]

    Description Solution 由于题目要求,将a[i]->b[i](边权为i)后所得的图应该是由森林和环套树组合而成. 假如是树形结构,所有的t[i]就直接在线段树t[i]点的dfs ...

  9. [2016北京集训测试赛5]小Q与内存-[线段树的神秘操作]

    Description Solution 哇真的异常服气..线段树都可以搞合并和拆分的啊orzorz.神的世界我不懂 Code #include<iostream> #include< ...

随机推荐

  1.     My GitHub

    0.引言 利用python开发,借助Dlib库捕获摄像头中的人脸,进行实时特征点标定: 图1 工程效果示例(gif) 图2 工程效果示例(静态图片) (实现比较简单,代码量也比较少,适合入门或者兴趣学 ...

  2. PV IP UV

    PV(访问量) Page View,页面浏览量. 具体的说,就是在一天内,该网站的页面总共访问了多少次 IP(独立IP) 一天内访问网站的IP数量 UV(独立访客) Unique Visitor 一般 ...

  3. 利用mock提高效率

    利用mock提高效率 谈到mock,就不得不讲前后端分离.理想情况下前后端不分离,由全栈的人以product和infrastructure的维度进行开发,效率是最高的.近些年来业务的复杂度越来越高,真 ...

  4. 麻省理工18年春软件构造课程阅读02“Java基础”

    本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...

  5. hdu2846 Repository 字典树(好题)

    把每个字符串的所有子串都加入字典树,但在加入时应该注意同一个字符串的相同子串只加一次,因此可以给字典树的每个节点做个记号flag--表示最后这个前缀是属于那个字符串,如果当前加入的串与它相同,且二者属 ...

  6. OPENCV 旋转图像算法-汇总

      void ImgRotate(cv::Mat imgIn, float theta, cv::Mat& imgOut) { int oldWidth = imgIn.cols; int o ...

  7. python+selenium+autoit实现文件上传

    问题 在做web端ui层自动化的时候会碰到文件上传的操作,经常有朋友问到,这里总结一下 解决方案 第一种:type=file的上传文件,类似如下的 使用类似这样的代码就可以完成: driver.fin ...

  8. 深刻理解iosBlock

    深刻理解iosBlock ///一个控制器里的方法 - (void)setRefreshHeader { ACWeakSelf(self); self.tableView.mj_header = [M ...

  9. 【前端】Vue和Vux开发WebApp日志一、整合vue+cordova和webpack+gulp

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux.html 项目github地址:https://github.com/shamoyuu/vue-vu ...

  10. linux下在用户空间访问I/O端口的ioperm和iopl函数

    1.ioperm函数      功能描述:为调用进程设置I/O端口访问权能.ioperm的使用需要具有超级用户的权限,只有低端的[0-0x3ff] I/O端口可被设置,要想指定更多端口的权能,可使用i ...