link

题意简述

小 $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 月赛] 博弈论与概率统计的更多相关文章

  1. bzoj 5283: [CodePlus 2018 3 月赛]博弈论与概率统计

    Description 大家的好朋友小 L 来到了博弈的世界.Alice 和 Bob 在玩一个双人游戏.每一轮中,Alice 有 p 的概率胜利,1 -p 的概率失败,不会出现平局.双方初始时各有 0 ...

  2. LOJ6300 BZOJ5283 [CodePlus 2018 3 月赛]博弈论与概率统计

    一道好题!很久以前就想做了,咕到了现在,讲第二遍了才做. 首先我们观察到$p$是没有用的 因为赢的次数一定 那么每一种合法序列出现的概率均为$p^n*(1-p)^m$ 是均等的 我们可以不看它了 然后 ...

  3. bzoj5204: [CodePlus 2018 3 月赛]投票统计(离散化+暴力)

    5204: [CodePlus 2018 3 月赛]投票统计 题目:传送门 题解: 谢谢niang老师的一道sui题 离散化之后直接搞啊(打完之后还错了...) 代码: #include<cst ...

  4. 【LibreOJ】#6354. 「CodePlus 2018 4 月赛」最短路 异或优化建图+Dijkstra

    [题目]#6354. 「CodePlus 2018 4 月赛」最短路 [题意]给定n个点,m条带权有向边,任意两个点i和j还可以花费(i xor j)*C到达(C是给定的常数),求A到B的最短距离.\ ...

  5. 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 ...

  6. BZOJ5204: [CodePlus 2018 3 月赛]投票统计

    [传送门:BZOJ5204] 简要题意: 有n个选手,每个选手会选择一道题投票,求出投票最多的题目个数和这些题目的编号,如果所有题目的投票数相同,则输出-1 题解: 直接搞 离散化,然后判断就可以了 ...

  7. BZOJ5205 [CodePlus 2018 3 月赛]白金元首与莫斯科

    传送门 emm在雅礼集训的时候听到的一道题 上来就觉得是插头dp 最后果然是轮廓线状压233 我们简化一下题意. 有一个n*m的网格,每个格子是空地或障碍物,询问把每一个空地看成障碍物的情况下,用1* ...

  8. LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]

    题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...

  9. 【LibreOJ】#6299. 「CodePlus 2018 3 月赛」白金元首与克劳德斯

    [题意]给出坐标系中n个矩形,类型1的矩形每单位时间向x轴正方向移动1个单位,类型2的矩形向y轴正方向,初始矩形不重叠,一个点被矩形覆盖当且仅当它在矩形内部(不含边界),求$(-\infty ,+\i ...

随机推荐

  1. linq 分页

    urList = (from u in urList                      orderby u.toolingNo_C                      select u) ...

  2. entry 遍历 Map 元素

    1.书写类 import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; public class test ...

  3. linux 硬件时间 系统时间

    建了一个虚拟机,发现每次重启后系统时钟总是跟现有时间相差10多个小时 用date -s进行修正之后,再次重启又出现该问题.于是怀疑跟硬件时钟有关 用hwclock看了下,发现的确硬件时钟的时间存在差异 ...

  4. UVa 1602 Lattice Animals (STL && 生成n连块 && 无方向形状判重)

    题意 : 给定一个 w * h 的 矩阵,在矩阵中找不同n个连通块的个数(旋转,翻转,平移算作一种) 分析 : 这题的关键点有两个 ① 生成n连块并且存储起来(因为题目是多测试用例,如果每一次都重新生 ...

  5. 以Emacs Org mode为核心的任务管理方案

    前言 如今用于任务管理的方法与工具越来越多,如纸笔系统.日历与任务列表.Emacs Org mode系统,以及移动设备上的诸多应用.这些解决方案各具特色,在一定程度上能够形成互补作用.但是,它们彼此之 ...

  6. codevs 1079 回家x

    1079 回家  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver   题目描述 Description 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰 ...

  7. shell基础练习题

    shell 基础练习题 1.编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 #!/bin ...

  8. Tomcat部署时war和war exploded区别以及平时踩得坑

    war和war exploded的区别 在使用IDEA开发项目的时候,部署Tomcat的时候通常会出现下边的情况: 是选择war还是war exploded 这里首先看一下他们两个的区别: war模式 ...

  9. Loading class `com.mysql.jdbc.Driver'. This is deprecated警告处理,jdbc更新处

    1.报错信息是这样的; 处理:提示信息表明数据库驱动com.mysql.jdbc.Driver'已经被弃用了.应当使用新的驱动com.mysql.cj.jdbc.Driver' 所以,按照提示更改jd ...

  10. 使用discriminator实现鉴别器

    1在人员接口实现方法 public Employee getEmpByIdStep(Integer id); 2在映射文件进行配置 <!-- public Employee getEmpById ...