【2016北京集训测试赛】azelso
[吐槽]
首先当然是要orzyww啦
以及orzyxq奇妙顺推很强qwq
嗯。。怎么说呢虽然说之前零零散散做了一些概d的题目但是总感觉好像并没有弄得比较明白啊。。(我的妈果然蒟蒻)
这题的话可以说是难得的一道搞得比较清楚的概d题目吧记录一下还是挺有意思的ovo
当然咯。。显然考场上并没有推出来。。嗯qwq
[题解]
看到说要求期望的距离,然后总的长度又被分成了一段一段的(各个事件)
所以就有一个比较直接的想法:将每一段期望走的次数算出来然后再乘上每一段的距离,加起来就是答案啦
那么现在问题来了怎么求期望走的次数
考虑定义
$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的更多相关文章
- 2016北京集训测试赛(十)Problem A: azelso
Solution 我们把遇到一个旗子或者是遇到一个敌人称为一个事件. 这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这 ...
- 【2016北京集训测试赛(十)】 Azelso (期望DP)
Time Limit: 1000 ms Memory Limit: 256 MB Description 题解 状态表示: 这题的状态表示有点难想...... 设$f_i$表示第$i$个事件经过之 ...
- 【2016北京集训测试赛(二)】 thr (树形DP)
Description 题解 (这可是一道很早就碰到的练习题然后我不会做不想做,没想到在Contest碰到欲哭无泪......) 题目大意是寻找三点对的个数,使得其中的三个点两两距离都为d. 问题在于 ...
- 【2016北京集训测试赛(八)】 crash的数列 (思考题)
Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...
- 【2016北京集训测试赛(十六)】 River (最大流)
Description Special Judge Hint 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. 题解 题目大意:给定两组点,每组有$n$个点,有若干条跨组 ...
- 【2016北京集训测试赛】river
HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...
- [2016北京集训测试赛17]crash的游戏-[组合数+斯特林数+拉格朗日插值]
Description Solution 核心思想是把组合数当成一个奇怪的多项式,然后拉格朗日插值..:哦对了,还要用到第二类斯特林数(就是把若干个球放到若干个盒子)的一个公式: $x^{n}=\su ...
- [2016北京集训测试赛15]statement-[线段树+拆环]
Description Solution 由于题目要求,将a[i]->b[i](边权为i)后所得的图应该是由森林和环套树组合而成. 假如是树形结构,所有的t[i]就直接在线段树t[i]点的dfs ...
- [2016北京集训测试赛5]小Q与内存-[线段树的神秘操作]
Description Solution 哇真的异常服气..线段树都可以搞合并和拆分的啊orzorz.神的世界我不懂 Code #include<iostream> #include< ...
随机推荐
- vue.js 安装过程(转载)
一.简介 Vue.js 是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核 ...
- 正"/" 和 反"\"的区别?
反斜杠"\"是电脑出现了之后为了表示程序设计里的特殊含义才发明的专用标点.就是说,除了程序设计领域外,任何地方你都不应该有使用反斜杠的时候,请永远使用正斜杠"/" ...
- PHP二维数组排序(感谢滔哥)
滔哥原创 /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\|| ...
- yaf框架刚开始遇到的问题
2016-10-17 17:54:13遇到的这个问题,这个问题算是比较综合性的问题,我也是查阅了很多的资料才大概明白的.这里就简单记录一下: 1.首先查看日志记录,结果如下: 根据错误日志:找寻到 ( ...
- web前端开发工程师工资多少
做web前端开发工程师工资高不高?下面千锋小编为大家分析一下:作为目前互联网行业中的主流技术,Web前端一直是占有重要的地位.尤其是近年来HTML5技术的突飞猛进,使Web前端技术有了更好的发展. ...
- 网络基础Cisco路由交换一
VLAN概述 Virtual LAN(虚拟局域网)是物理设备上链接的不受物理位置限制的用户的一个逻辑组,. 引用VLAN: 交换机分割了冲突域,但是不能分割广播域,随着交换机端口数量的增多,网络中广播 ...
- 使用阿里云主机离线部署CDH步骤详解
一.Linux文件系统准备 1. 拍摄快照 登录阿里云控制台,拍摄快照,注意有几个关键点尽量拍摄快照,系统初始状态.CM环境准备完成.CM安装完成.CDH安装完成. 2. 挂载设备 三个主机都执行. ...
- ubuntu 14.04 分辨率调整 -- xrandr命令
问题描述: 自己在安装ubuntu-kylin 14.04 TLS系统成功后,在调整分辨率的时候(系统设置--显示)发现分辨率的选项只有1024x768以及800x600两个选项,而台式机的外接显示屏 ...
- spring schedule定时任务(二):配置文件的方式
接着上一篇,这里使用spring配置文件的方式生成spring定时任务. 1.相应的web.xml没有什么变化,因此便不再罗列.同样的,相应的java代码业务逻辑改动也不大,只是在原来的基础上去掉@C ...
- udp协议的数据接收与发送的代码
我想基于lwIP协议中的UDP协议,用单片机做一个服务器,接受电脑的指令然后返回数据.以下是我的代码 /************************************************ ...