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. luogu 4366 [Code+#4]最短路 Dijkstra + 位运算 + 思维

    这个题思路十分巧妙,感觉很多题都有类似的套路. 我们发现异或操作其实就是将一个数的二进制的若干个 $0$ 变成 $1$,或者一些 $1$ 变成 $0$. 而每次按照某种顺序一位一位地异或也可以起到同时 ...

  2. Codeforces Round #287 (Div. 2) E. Breaking Good 路径记录!!!+最短路+堆优化

    E. Breaking Good time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. TCP大文件上传与UDP协议

    一.UCP大文件上传(解决粘包问题) ①客户端 import socket, os, json, struct client = socket.socket() client.connect(('12 ...

  4. No 'Configuration' method was found in class 'WebApp.Startup

    The following errors occurred while attempting to load the app.- No 'Configuration' method was found ...

  5. [BZOJ2669][CQOI2012]局部极小值:DP+容斥原理

    分析 题目要求有且只有一些位置是局部极小值.有的限制很好处理,但是只有嘛,嗯...... 考虑子集反演(话说这个其实已经算是超集反演了吧还叫子集反演是不是有点不太合适),枚举题目给出位置集合的所有超集 ...

  6. 同一个tomcat部署多个项目11

    在开发项目中,有时候我们需要在同一个tomcat中部署多个项目,小编之前也是遇到了这样的情况,碰过不少的壁,故整理总结如下,以供大家参考.(以Linux为例,其他系统同样适用) 一.首先将需要部署的项 ...

  7. Java九种基本数据类型,以及他们的封装类

    基本类型 大小(字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer long 8 0L Long float ...

  8. JavaScript-Load-Image

    如何将图片显示为canvas https://github.com/blueimp/JavaScript-Load-Image/blob/master/js/load-image-scale.js h ...

  9. 555E Case of Computer Network

    分析 一个连通块内的肯定不影响 于是我们先缩点 之后对于每个路径 向上向下分别开一个差分数组 如果两个数组同时有值则不合法 代码 #include<bits/stdc++.h> using ...

  10. leetcode234 回文链表 两种做法(stack(空间非O(1)),空间O(1))

    link: leetcode234 回文链表 方法1, 快慢指针,把前半部分存入栈中和后半部分比较 public boolean isPalindrome(ListNode head) { if(he ...