【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< ...
随机推荐
- 微信小程序(一)
开发流程 注册微信小程序并申请微信支付-->制作小程序-->上传并提交审核-->审核通过,小程序上线 开发微信小程序需要准备 企业公众号(被认证)以及申请小程序.微信开发技术.S ...
- 项目中AppDelegate详解
1.AppDelegate.h //模板默认引入程序需要使用“类”的框架,即UIKit.h头文件,使它包含在程序中 #import <UIKit/UIKit.h> //此处@class声明 ...
- UVA - 12333 字典树+大数
思路:用字典树将前40个数字记录下来,模拟大数加法即可. AC代码 #include <cstdio> #include <cmath> #include <algori ...
- 【BZOJ3993】 星际战争
Time Limit: 1000 ms Memory Limit: 128 MB Description 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战.在战斗的某一阶段,Y军团一 ...
- 网站入住各大搜索引擎的seo优化技巧
最近在公司上班的时候做了一个工业物联网的项目,上层主管提出要求,让这个网站入住各大搜索引擎,也就是说在各大搜索引擎中输入与网站相关的关键字就能搜索到我们自己的网站.刚开始自己一脸懵逼,因为之前自己并没 ...
- web前端开发工程师工资多少
做web前端开发工程师工资高不高?下面千锋小编为大家分析一下:作为目前互联网行业中的主流技术,Web前端一直是占有重要的地位.尤其是近年来HTML5技术的突飞猛进,使Web前端技术有了更好的发展. ...
- 【前端】Vue和Vux开发WebApp日志一、整合vue+cordova和webpack+gulp
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/vue_vux.html 项目github地址:https://github.com/shamoyuu/vue-vu ...
- FusionCharts 2D柱状图和折线图的组合图
1.设计思路 (1)了解组合图的特性以及用法,选用图的类型: (2)设计出两根柱子和两根折线,分开展示. 2.设计步骤 (1)设计页面 Column2DLine.html: <!DOCTYPE ...
- Netty未来展望
作为<Netty权威指南(第2版)>的结尾章节,和读者朋友们一起展望下Netty的未来. 1应用范围 随着大数据.互联网和云计算的发展,传统的垂直架构逐渐将被分布式.弹性伸缩的新架构替代. ...
- Java中的字符串拼接
Java中的字符串拼接 1.设计源码 /** * @Title:IndexOf.java * @Package:com.you.freemarker.model * @Description: * @ ...