[CodePlus 2018 3 月赛] 博弈论与概率统计
题意简述
小 $A$ 与小 $B$ 在玩游戏,已知小 $A$ 赢 $n$ 局,小 $B$ 赢 $m$ 局,没有平局情况,且赢加一分,输减一分,而若只有 $0$ 分仍输不扣分。
已知小 $A$ 每次赢得概率为 $p$ ,问小 $A$ 得分期望。 $T$ 组数据。
$T,n,m\leq 2.5\times 10^5$
$solution:$
因为赢场输场已经固定,所以 $p$ 其实是没有用,则现在考虑计算小 $A$ 得分总和。
将赢输场前缀和,记为 $\{s\}$,则得分为 $n-m-min\{s\}$ 。假设所有 $-1$ 均有意义,则分数为 $n-m$ 。
设 $min\{s\}=x$,则第一次出现 $-1,-2,…,x$ 均无意义因为当时得分前为 $0$ 而又被 $-1$,无意义,共出现 $|x|$ 次情况,即得分为 $n-m-min\{s\}$。
所以现在的问题转化为给定 $n$ 个 $1$ 与 $m$ 个 $-1$ ,问最小前缀和为 $w$ 的方案数。
基本操作,将问题转化为平面移动问题。
若要求最小前缀和为 $w$ 的方案数,可以表示为从 $(0,0)$ 走到 $(n,m)$ 的方案数,每次往上或左走一步求经过 $y=x+w$ 但不能经过 $y=x+w+1$ 直线的方案数。
考虑求从 $(1,1)$ 到 $(n,m)$ 经过 $y=x+w$ 的方案数,可以将第一次经过 $y=x+w$ 的交点之前部分对 $y=x+w$ 对称,则 $(0,0)$ 对称到 $(-w,w)$ ,可以发现每次从 $(-w,w)$ 到 $(n,m)$ 经交点对称后对应一条合法路径,则其方案数为 $\dbinom{n+m}{n+w}$ 。
通过简单容斥原理得到若最小前缀和为 $w$ 的方案数为 $\dbinom{n+m}{n+w}-\dbinom{n+m}{n+w+1}$ 。
考虑赢 $n$ 场输 $m$ 场的得分,得分区间为 $[max\{0,n-m\},n]$ 。
分类讨论 $n,m$ 大小。
若 $n\geq m$ ,则得分区间在 $[n-m,n]$ , $min\{s\}\in [-m,0]$。
$$Ans=\sum_{i=0}^{m} (n-m+i) (\dbinom{n+m}{n+i}-\dbinom{n+m}{n+i+1})\\=(n-m) \sum_{i=0}^m(\dbinom{n+m}{n+i}-\dbinom{n+m}{n+i+1}) +\sum_{i=0}^m i\times (\dbinom{n+m}{m-i}-\dbinom{n+m}{m-i-1})\\=(n-m)\dbinom{n+m}{n}+\sum_{i=0}^{m-1} \dbinom{n+m}{i}$$
若 $n<m$ ,则同理 $min\{s\}\in [{-m,n-m}]$
$$Ans=\sum_{i=m-n}^m (n-m+i)\times\dbinom{n+m}{m-i}-\dbinom{n+m}{m-i-1}\\=(n-m)\dbinom{n+m}{n}+\sum_{i=m-n}^m i\times \dbinom{n+m}{m-i}-\sum_{i=m-n}^{m-1} i\times \dbinom{n+m}{m-i-1}\\=(n-m)\dbinom{n+m}{n}+(m-n)\dbinom{n+m}{n}+\sum_{i=m-n+1}^m i\times \dbinom{n+m}{m-i}-\sum_{i=m-n}^{m-1} i\times \dbinom{n+m}{m-i-1}\\=\sum_{i=m-n+1}^{m-1} i\times\dbinom{n+m}{m-i}-\sum_{i=m-n+1}^{m} (i-1)\times \dbinom{n+m}{m-i+1}\\=\sum_{i=m-n+1}^{m} \dbinom{n+m}{m-i}\\=\sum_{i=0}^{n-1}\dbinom{n+m}{i}$$
可以发现现在的问题为如何快速求 $F(n,k)=\sum_{i=0}^k \dbinom{n}{i}$
可以发现 $F(n,k)=\sum_{i=0}^k \dbinom{n-1}{i-1}+\dbinom{n-1}{i}=2\times F(n-1,k)-\dbinom{n-1}{k}$ 。即 $F(n,k)$ 与 $F(n-1,k)$ 和 $F(n,k-1)$ 都有递推关系。
直接将答案离线后莫队计算即可。
时间复杂度 $O((n+m)\sqrt{n+m})$ 。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define int long long
#define mod 1000000007
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return ans*f;
}
const int MAXN=;
struct Query{
int l,r,bl,id;
}query[MAXN],tmp[MAXN];
bool cmp(Query x1,Query x2){
if(x1.bl!=x2.bl) return x1.l<x2.l;
if(x1.bl&) return x1.r<x2.r;
return x1.r>x2.r;
}
int T,p,Ans[MAXN],inv[MAXN],ifac[MAXN],fac[MAXN];
inline void init(){
fac[]=;for(int i=;i<MAXN;++i) fac[i]=fac[i-]*i,fac[i]%=mod;
inv[]=;for(int i=;i<MAXN;++i) inv[i]=(mod-mod/i)*inv[mod%i],inv[i]%=mod;
ifac[]=;for(int i=;i<MAXN;++i) ifac[i]=ifac[i-]*inv[i],ifac[i]%=mod;
return;
}
inline int C(int a,int b){if(a<b) return ;return (((fac[a]*ifac[b])%mod)*ifac[a-b])%mod;}
inline int F(int a,int b){return (((fac[b]*fac[a-b])%mod)*ifac[a])%mod;}
inline int ksm(int a,int b){
int ans=;
while(b){
if(b&) ans*=a,ans%=mod;
a*=a,a%=mod;b>>=;
}return ans;
}
int blo,bl[MAXN],l,r,ans,inv2;
int Mod(int x){return ((x%mod)+mod)%mod;}
signed main(){
// freopen("20.in","r",stdin);
init();
T=read(),p=read();blo=;
for(register int i=;i<MAXN;++i) bl[i]=(i-)/blo+;
for(register int i=;i<=T;++i){
int n=read(),m=read();
if(n>=m) Ans[i]=(n-m)*C(n+m,n),query[i].l=n+m,query[i].r=m-,query[i].bl=bl[query[i].l];
else query[i].l=n+m,query[i].r=n-,query[i].bl=bl[query[i].l];
query[i].id=i;
tmp[i].l=n,tmp[i].r=m;
}sort(query+,query+T+,cmp);
l=,r=,ans=;inv2=ksm(,mod-);
for(register int i=;i<=T;++i){
while(l<query[i].l) ans=Mod(*ans-C(l,r)),l++;
while(l>query[i].l) ans=Mod(Mod(ans+C(l-,r))*inv2),l--;
while(r<query[i].r) ans+=C(l,r+),ans=Mod(ans),r++;
while(r>query[i].r) ans-=C(l,r),ans=Mod(ans),r--;
Ans[query[i].id]+=ans,Ans[query[i].id]%=mod;
}
for(register int i=;i<=T;++i){Ans[i]*=F(tmp[i].l+tmp[i].r,tmp[i].l);Ans[i]%=mod;}
for(register int i=;i<=T;++i) printf("%lld\n",Ans[i]);
return ;
}
[CodePlus 2018 3 月赛] 博弈论与概率统计的更多相关文章
- bzoj 5283: [CodePlus 2018 3 月赛]博弈论与概率统计
Description 大家的好朋友小 L 来到了博弈的世界.Alice 和 Bob 在玩一个双人游戏.每一轮中,Alice 有 p 的概率胜利,1 -p 的概率失败,不会出现平局.双方初始时各有 0 ...
- LOJ6300 BZOJ5283 [CodePlus 2018 3 月赛]博弈论与概率统计
一道好题!很久以前就想做了,咕到了现在,讲第二遍了才做. 首先我们观察到$p$是没有用的 因为赢的次数一定 那么每一种合法序列出现的概率均为$p^n*(1-p)^m$ 是均等的 我们可以不看它了 然后 ...
- bzoj5204: [CodePlus 2018 3 月赛]投票统计(离散化+暴力)
5204: [CodePlus 2018 3 月赛]投票统计 题目:传送门 题解: 谢谢niang老师的一道sui题 离散化之后直接搞啊(打完之后还错了...) 代码: #include<cst ...
- 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra
[题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...
- 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 ...
- BZOJ5204: [CodePlus 2018 3 月赛]投票统计
[传送门:BZOJ5204] 简要题意: 有n个选手,每个选手会选择一道题投票,求出投票最多的题目个数和这些题目的编号,如果所有题目的投票数相同,则输出-1 题解: 直接搞 离散化,然后判断就可以了 ...
- 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 ...
随机推荐
- luoguP1197 [JSOI2008]星球大战 x
P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中 ...
- SpringBoot2.2发行版新特性
Spring Framework升级 SpringBoot2.2的底层Spring Framework版本升级为5.2. JMX默认禁用 默认情况下不再启用JMX. 可以使用配置属性spring.jm ...
- 苹果cms模板文件不存在:public/jump.html
1,模板文件不存在很显然就是模板缺少文件导致,缺少什么文件一般都会提示.(如上图)点击首页的时,有的能进入播放页 有的提示(上图) 模版文件不存在:public/jump.html 通过查询苹果cm ...
- PISCES: A Programmable, Protocol-Independent Software Switch
Name of article:PISCES: A Programmable, Protocol-Independent Software Switch Origin of the article:S ...
- Java数据库之数据库的连接操作
这里面我们所连接的数据库是mysql数据库,Oracle数据库暂且先不讨论,并且mysql中的基本语法,这里面也不在一一表述了,但是看这篇文章之前,最好先仔细的连接mysql的基本语法,看起来方便~ ...
- OI常用的常数优化小技巧
注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优 ...
- 《Effective Java》读书笔记 - 9.异常
Chapter 9 Exceptions Item 57: Use exceptions only for exceptional conditions 这条item的意思就是,千万不要用except ...
- 高级软件测试技术-任务进度和总结-Day04
任务进度11-16 使用工具 Jira 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了这几天的学习和小组成员的努力,虽然其中还准备了考试,但是大家还是最终按时完成了任务,今 ...
- 目标双站定位仿真C++代码
point-position2 初步完善版. 不再使用eigen库,行列式直接计算得出结果.判断共面异面分别处理. 先提取双站获得图像的匹配特征点,由双站位置信息解析目标位置. // point-po ...
- Visual Studio Code - 同步代码时使用 rebase
打开设置 设置"git.rebaseWhenSync": true