bzoj 5283: [CodePlus 2018 3 月赛]博弈论与概率统计
Description
大家的好朋友小 L 来到了博弈的世界。Alice 和 Bob 在玩一个双人游戏。每一轮中,Alice 有 p 的概率胜利,1
-p 的概率失败,不会出现平局。双方初始时各有 0 分,当一个人胜利的时候,他会获得一分,失败则扣掉一分。
遗憾的是,博弈论世界的人目前是无法理解负数的,因此,如果某个人输掉一轮比赛的时候他只有 0 分,那么他
就不会被扣分(对方会照常加一分)。游戏一共要进行 N+M 轮,Alice 想请你帮她算算在游戏结束时她的得分的
数学期望。"这算啥,我小 L 分分钟搞定!"。比小 L 更熟练的你当然也是随手就算出来了,但就在你打算告诉 A
lice 答案之前,博弈论世界之神--temporaryDO 出现了,他给大家带来了一个重要信息:这 N+M 轮游戏中, Ali
ce 恰好赢了 N 轮!熟知条件概率那套理论的你立刻注意到,你需要修改自己的计算方法来得到正确的答案了。为
了避免精度问题,请将结果对 10^9+7 取模。即,我们的数据保证答案是一个有理数 p/q ,且有 10^9+7与q互质
,你只需要找到一个整数 x∈[0,10^9+7) 使得 qx≡p(mod 10^9+7) 即可。
Solution
这题跟 \(p\) 没关系
设数组 \(A\) 为得分序列, \(B\) 为\(A\) 的前缀和
那么答案就是 \(B_n-min(B_i)=n-m-min(B_i)\) (不会证明 \(QwQ\))
现在就是要求 \(min(B_i)\) 的期望了
把这个过程看成 \((0,0)\) 走到 \((n,m)\) 的方案数,往右是 \(+1\),往上是 \(-1\)
总方案数是 \(C(n+m,n)\)
最小值小于等于 \(i\) 的方案就是穿过直线 \(y=x+i\) 的方案
用 \(catalan\) 数那一套理论,把 \((0,0)\) 沿着这条直线对折过去,穿过直线的方案就是这个点到 \((n,m)\) 的方案
得分的取值范围是 \([max(n-m,0),n]\) ,枚举最小值算一下贡献
假设 \(n>=m\),容斥一下最小值等于 \(i\) 的方案
\(\sum_{i=0}^{m} (C_{n+m}^{n+i}-C_{n+m}^{n+i+1})*(n-m+i)\)
\((n-m)*C_{n+m}^{n}+\sum_{i=1}^{m}C_{n+m}^{n+i}\)
\((n-m)*C_{n+m}^{n}+\sum_{i=1}^{m}C_{n+m}^{m-i}\)
\((n-m)*C_{n+m}^{n}+\sum_{i=0}^{m-1}C_{n+m}^{i}\)
\(n<m\) 时
\(\sum_{i=m-n}^{m} (C_{n+m}^{n+i}-C_{n+m}^{n+i+1})*(n-m+i)\)
按上面的方法化简出来就是:\(\sum_{i=0}^{n-1}C_{n+m}^{i}\)
可以把两种情况的式子总和一下:
\(max(0,n-m)*C_{n+m}^{n}+\sum_{i=0}^{min(n,m)-1}C_{n+m}^{i}\)
最后除以 \(C_{n+m}^{n}\) 就是期望
但是后面一项 \(\sum_{i=0}^{min(n,m)-1}C_{n+m}^{i}\) 不能暴力求
相当于是杨辉三角的一行的前缀和
然后就是一个新套路,莫队维护这个东西
设 \(F(n,m)\) 表示 \(\sum_{i=1}^{m}C_{n}^{i}\)
那么 \(F(n,m)->F(n,m+1)\) 和 \(F(n,m)->F(n+1,m)\) 都是可以 \(O(1)\) 算的
其中 \(F(n+1,m)=F(n,m)*2-C_{n}^{m}\)
\(C_{n}^{m}=C_{n-1}^{m-1}+C_{n-1}^{m}\) 就可以证明
复杂度有点卡,\(bzoj\) 过不去
#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=3e5+10,mod=1e9+7;
int Q,P,B,n=0,Fac[N],inv[N],ans[N],INV[N];
struct data{
int x,y,id,L,R;
inline bool operator <(const data &p)const{
return L!=p.L?L<p.L:R<p.R;
}
}q[N];
inline int C(int a,int b){return 1ll*Fac[a]*inv[b]%mod*inv[a-b]%mod;}
inline int F(int a,int b){return 1ll*Fac[b]*Fac[a-b]%mod*inv[a]%mod;}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>Q>>P;B=sqrt(Q);
for(int i=1;i<=Q;i++){
gi(q[i].x),gi(q[i].y),q[i].id=i,n=max(n,q[i].y+q[i].x);
q[i].L=(q[i].x+q[i].y)/B;q[i].R=min(q[i].x,q[i].y)-1;
}
Fac[0]=INV[0]=INV[1]=inv[0]=1;
for(int i=2;i<=n;i++)INV[i]=(mod-1ll*(mod/i)*INV[mod%i]%mod)%mod;
for(int i=1;i<=n;i++)Fac[i]=1ll*Fac[i-1]*i%mod,inv[i]=1ll*inv[i-1]*INV[i]%mod;
sort(q+1,q+Q+1);
register int l=0,r=0,s=1;
for(int i=1;i<=Q;i++){
int L=q[i].x+q[i].y,R=min(q[i].x,q[i].y)-1;
while(l<L)s=(1ll*(s<<1)-C(l,r)+mod)%mod,l++;
while(l>L)l--,s=1ll*(s+C(l,r))*INV[2]%mod;
while(r<R)r++,s=(s+C(l,r))%mod;
while(r>R)s=(s-C(l,r)+mod)%mod,r--;
ans[q[i].id]=
(max(q[i].x-q[i].y,0)+1ll*s*F(L,q[i].y))%mod;
}
for(int i=1;i<=Q;i++)printf("%d\n",ans[i]);
return 0;
}
bzoj 5283: [CodePlus 2018 3 月赛]博弈论与概率统计的更多相关文章
- [CodePlus 2018 3 月赛] 博弈论与概率统计
link 题意简述 小 $A$ 与小 $B$ 在玩游戏,已知小 $A$ 赢 $n$ 局,小 $B$ 赢 $m$ 局,没有平局情况,且赢加一分,输减一分,而若只有 $0$ 分仍输不扣分. 已知小 $A$ ...
- LOJ6300 BZOJ5283 [CodePlus 2018 3 月赛]博弈论与概率统计
一道好题!很久以前就想做了,咕到了现在,讲第二遍了才做. 首先我们观察到$p$是没有用的 因为赢的次数一定 那么每一种合法序列出现的概率均为$p^n*(1-p)^m$ 是均等的 我们可以不看它了 然后 ...
- 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
[题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...
- bzoj5204: [CodePlus 2018 3 月赛]投票统计(离散化+暴力)
5204: [CodePlus 2018 3 月赛]投票统计 题目:传送门 题解: 谢谢niang老师的一道sui题 离散化之后直接搞啊(打完之后还错了...) 代码: #include<cst ...
- loj6300 「CodePlus 2018 3 月赛」博弈论与概率统计
link 题意: A和B玩游戏,每轮A赢的概率为p.现在有T组询问,已知A赢了n轮输了m轮,没有平局,赢一局A得分+1,输一局得分-1,问A得分期望值? $n+m,T\leq 2.5\times 10 ...
- BZOJ5205 [CodePlus 2018 3 月赛]白金元首与莫斯科
传送门 emm在雅礼集训的时候听到的一道题 上来就觉得是插头dp 最后果然是轮廓线状压233 我们简化一下题意. 有一个n*m的网格,每个格子是空地或障碍物,询问把每一个空地看成障碍物的情况下,用1* ...
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯
[题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ...
- 【LibreOJ】#6298. 「CodePlus 2018 3 月赛」华尔兹 BFS
[题意]给定n*m的网格,起点和终点位置,一些格指定下一步的方向,一些格任意.要求为方向任意的格确定方向,使起点可以走到终点.n,m<=50. [算法]BFS [题解]这道题最好用BFS,因为D ...
随机推荐
- Linux 内核list_head 学习
Linux 内核list_head 学习(一) http://www.cnblogs.com/zhuyp1015/archive/2012/06/02/2532240.html 在Linux内核中,提 ...
- LoadRunner--获取请求的返回结果函数
注:内容来自网络 Action(){ web_set_max_html_param_len("262144"); // 默认最大长度为256 web_reg_save_param( ...
- IO模型《二》阻塞IO
阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel就开始 ...
- conda install 安装太慢怎么办?
小编我在安装tensorflow和keras的过程中,安装进程太慢,小木棍一直在转圈...抓狂... 如何解决??? 使用清华提供的anaconda镜像,使用以后真的很快! Anaconda 镜像使用 ...
- winform发布桌面程序后提示需开启“目录浏览”
把发布文件里的publish.htm名字改为index.htm就好了
- bzoj 3864: Hero meet devil(dp套dp)
题面 给你一个只由\(AGCT\)组成的字符串\(S (|S| ≤ 15)\),对于每个\(0 ≤ .. ≤ |S|\),问 有多少个只由\(AGCT\)组成的长度为\(m(1 ≤ m ≤ 1000) ...
- 洛谷P4526 【模板】自适应辛普森法2(Simpson法)
题面 传送门 题解 据说这函数在\(x>15\)的时候趋近于\(0\) 据说当且仅当\(a<0\)时积分发散 所以直接套自适应\(simpson\)吧-- //minamoto #incl ...
- Jenkins持续集成企业实战系列之两种网站部署的流程-----01
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- Liunux疑问
Liunux疑问 其中的各种软件的安装有模糊的点,待解决 待解决 待解决 待解决 ... ...
- 怎样将结构完全一样的两个表的内容合并到一个表中,SQL语句
标签: SQL合并数据 2013-08-21 10:41 489人阅读 评论(0) 收藏 举报 分类: Oracle数据库(14) select * into 新表名 from (select ...