Solution

我们把遇到一个旗子或者是遇到一个敌人称为一个事件.

这一题思路的巧妙之处在于我们要用\(f[i]\)表示从\(i\)这个事件一直走到终点这段路程中, \(i\)到\(i + 1\)这段路只被经过一次的概率. 分类讨论:

  • \(i + 1\)是一个敌人, 则\(f[i] = f[i + 1] \times p[i + 1]\)
  • \(i + 1\)是一个旗子, 则

\[f[i] = f[i + 1] \\ + f[i + 1] \times (1 - f[i + 1]) \times p[i + 1] \\ + f[i + 1] \times (1 - f[i + 1]) \times p[i + 1] \times (1 - f[i + 1]) \times p[i + 1] \\ + ... \\ + f[i + 1] \times (1 - f[i + 1])^\infty \times p[i + 1]^\infty
\]

表示\(i + 1\)到\(i + 2\)这一段只被走一次的概率, 加上走过\(i + 1\)后掉回\(i + 1\), 再往后走, 再掉回\(i + 1\), 一直循环, 一直掉回\(i + 1\), 直到走到终点的概率. 上面的式子用无限和式稍微处理即可化简.

然后我们又发现一段路程的被走过的期望次数等于\(1 / p_i\), 因此就可以方便地统计总共要走的期望距离.

#include <cstdio>
#include <cctype> namespace Zeonfai
{
inline long long getInt()
{
long long a = 0, sgn = 1; char c;
while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;
while(isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
inline char getChar()
{
char c;
while(! isgraph(c = getchar()));
return c;
}
}
const long long MOD = 1e9 + 7, N = 1e5;
inline long long getInverse(long long a)
{
long long res = 1;
for(long long x = MOD - 2; x; a = a * a % MOD, x >>= 1) if(x & 1) res = res * a % MOD;
return res;
}
int main()
{ #ifndef ONLINE_JUDGE freopen("azelso.in", "r", stdin);
freopen("azelso.out", "w", stdout); #endif using namespace Zeonfai;
long long len = getInt(), n = getInt();
static long long opt[N + 2], pos[N + 2], E[N + 2], p[N + 2];
for(long long i = 1; i <= n; ++ i)
{
opt[i] = getChar() == 'F' ? 0 : 1;
pos[i] = getInt() % MOD;
long long a = getInt(), b = getInt(); p[i] = a * getInverse(b) % MOD;
}
E[n] = 1;
for(long long i = n - 1; ~ i; -- i) E[i] = opt[i + 1] == 0 ? (E[i + 1] - p[i + 1] * E[i + 1] % MOD + p[i + 1] + MOD) % MOD : E[i + 1] * getInverse(p[i + 1]) % MOD;
long long ans = 0; pos[0] = 0; pos[n + 1] = len;
for(long long i = 0; i <= n; ++ i)
ans = (ans + (pos[i + 1] - pos[i] + MOD) * E[i] % MOD) % MOD;
// ans = (ans + len - pos[n]) % MOD;
printf("%d\n", ans);
}

2016北京集训测试赛(十)Problem A: azelso的更多相关文章

  1. 2016北京集训测试赛(十六)Problem C: ball

    Solution 这是一道好题. 考虑球体的体积是怎么计算的: 我们令\(f_k(r)\)表示\(x\)维单位球的体积, 则 \[ f_k(1) = \int_{-1}^1 f_{k - 1}(\sq ...

  2. 2016北京集训测试赛(十六)Problem B: river

    Solution 这题实际上并不是构造题, 而是一道网络流. 我们考虑题目要求的一条路径应该是什么样子的: 它是一个环, 并且满足每个点有且仅有一条出边, 一条入边, 同时这两条边的权值还必须不一样. ...

  3. 2016北京集训测试赛(十六)Problem A: 任务安排

    Solution 这道题告诉我们, 不能看着数据范围来推测正解的时间复杂度. 事实证明, 只要常数足够小, \(5 \times 10^6\)也是可以跑\(O(n \log n)\)算法的!!! 这道 ...

  4. 2016北京集训测试赛(十四)Problem B: 股神小D

    Solution 正解是一个\(\log\)的link-cut tree. 将一条边拆成两个事件, 按照事件排序, link-cut tree维护联通块大小即可. link-cut tree维护子树大 ...

  5. 2016北京集训测试赛(十四)Problem A: 股神小L

    Solution 考虑怎么卖最赚钱: 肯定是只卖不买啊(笑) 虽然说上面的想法很扯淡, 但它确实能给我们提供一种思路, 我们能不买就不买; 要买的时候就买最便宜的. 我们用一个优先队列来维护股票的价格 ...

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

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

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

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

  8. 2016北京集训测试赛(十七)Problem C: 数组

    Solution 线段树好题. 我们考虑用last[i]表示\(i\)这个位置的颜色的上一个出现位置. 考虑以一个位置\(R\)为右端点的区间最远能向左延伸到什么位置: \(L = \max_{i \ ...

  9. 2016北京集训测试赛(十七)Problem B: 银河战舰

    Solution 好题, 又是长链剖分2333 考虑怎么统计答案, 我场上的思路是统计以一个点作为结尾的最长上升链, 但这显然是很难处理的. 正解的方法是统计以每个点作为折弯点的最长上升链. 具体的内 ...

随机推荐

  1. 2.使用vue ui命令快速构建应用

    直接在web端新建应用 C:\Users\Hugo> vue ui

  2. 浅谈javascript的运行机制

    积累一下这几天学的,记录一下: 一.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程 ...

  3. JS空数组的判断

    前言 最近在做一个mini项目,被大神各种鄙视,基础知识确实是不扎实,加油加油.好了,不多废话,抽空写写遇到的两个知识点,就记录下来,写博客还是能帮忙整理记录的,不然过了就忘记了. input监听值改 ...

  4. MFC定时关机程序的实现2-添加启动项到注册表

    虽然上一篇实现了的定时关机,但是还不够完善,比如开机自动启动,然后按照配置的时间定时关机,并最小化到任务栏. 先来说开机启动怎么实现,开机启动实现的方法有好几种,比如直接在开始菜单启动项里添加一个程序 ...

  5. Monkey log异常分析说明

    以下主要针对在Android-Phone项目中进行Monkey log进行分析和说明,可以对bug提交作为参考. 要求熟悉,应用的包名.也就是说那个应用包出现问题,该属于那个模块,应用包名是判断依据. ...

  6. 聊聊、RabbitMQ 第一篇

    (一)windows 下安装配置 开源的消息中间件有很多,各有各的优缺点,适合自己项目的才是最好的.首先下载 rabbitMQ 安装版本,因为 rabbitMQ 底层语言是 erlang,所以首先要先 ...

  7. c++11特性使用

    #include <list> #include <iostream> int main(){ list<int> lst; for(list<int> ...

  8. application.properties 详解

    mvc spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体实现的超时时间为准,比如tomcat的servlet3的话是 ...

  9. PAT1039

    小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子 ...

  10. springboot的api测试