【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< ...
随机推荐
- VC下防止反汇编的办法(1)
最近在看IDA的书,讲汇编语言的部分提到了一种防止递归向下汇编器逆向程序的方法 这里esp指向栈顶,也就是调用方最后入栈的返回地址.然而实际在VC2017里用内联汇编这么做是不行的,原因可以看看VC生 ...
- Redis进阶实践之十二 Redis的Cluster集群动态扩容
一.引言 上一篇文章我们一步一步的教大家搭建了Redis的Cluster集群环境,形成了3个主节点和3个从节点的Cluster的环境.当然,大家可以使用 Cluster info 命令查看Cl ...
- 二叉排序树、平衡二叉树、B树&B+树、红黑树的设计动机、缺陷与应用场景
之前面试时曾被问到"如果实现操作系统的线程调度应该采用什么数据结构?",因为我看过ucore的源码,知道ucore是采用斜堆的方式实现的,可以做到O(n)的插入.O(1)的查找.我 ...
- 来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项
索引的基础概念索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码:存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行 ...
- dubbox系列【四】——使用dubbo-monitor-x监控注册中心
1.下载源码,编译成war包 源码下载地址为:https://git.oschina.net/yjmyzz/dubbo-monitor.git 在pom.xml文件所在目录,直接执行mvn packa ...
- 剑指offer第二天
18.二叉树的镜像 操作给定的二叉树,将其变换为源二叉树的镜像. /** public class TreeNode { int val = 0; TreeNode left = null; Tree ...
- 用pycharm+flask 建立项目以后运行出现ImportError: No module named flask-login问题
出现此问题,一般情况下: 打开CMD输入: pip install flask-login 然后,在cmd中输入命令: pip list 查看目前已安装的的模板.在此时,如果你继续运行项目,有可能会发 ...
- python高阶函数式编程
from functools import reduce def str2int(s): def fn(x, y): return x * 10 + y def char2num(s): return ...
- 5_Longest Palindromic Substring(Manacher) --LeetCode
参考:https://www.felix021.com/blog/read.php?2040,https://segmentfault.com/a/1190000002991199 做了修改. 首先用 ...
- 相位噪声 dBc/Hz
相位噪声和抖动是对同一种现象的两种不同的定量方式.在理想情况下,一个频率固定的完美的脉冲信号(以1 MHz为例)的持续时间应该恰好是1微秒,每500ns有一个跳变沿.但不幸的是,这种信号并不存在.如图 ...