link

题意:

A和B玩游戏,每轮A赢的概率为p。现在有T组询问,已知A赢了n轮输了m轮,没有平局,赢一局A得分+1,输一局得分-1,问A得分期望值?

$n+m,T\leq 2.5\times 10^5.$

题解:

首先p并没有用。我们需要的是计算所有可能局面A的得分和,最后除以$C_{n+m}^{n}$。

发现得分不小于0非常奇怪,转化一下,考虑设最后一个为0的状态:A赢x次,输y次。那么得分为(n-x)-(m-y)=n-m+y-x。令k=y-x,则y=k+x。其中需要满足$k\geq \max(m-n,0)$,原因:既要保证之前得分$\leq 0$($y\geq x$),又要保证之后不会出现$\leq 0$($m-y\leq n-x$)。

(x,y)抽象成平面上的点。整个游戏相当于一条从(0,0)到(n,m)的路径,A赢横坐标+1,A输纵坐标+1,它的得分应该是路径上y-x最大的点的y-x+n-m(最后一个0的状态肯定是在那里取到)。

直接统计得分不那么容易。考虑对于某一个k计算经过直线y=x+k的路径条数$S_k$,那么它们的分数肯定$\geq k+n-m$。$S_k-S_{k-1}$就是分数恰好为k+n-m的路径条数。如何计算$S_k$?将(0,0)到路径和y=x+k的第一个交点这部分沿y=x+k翻转,那么等价于计算(-k,k)到(n,m)的路径条数,方案数为$C_{n+m}^{n+k}$。

假设$n\ge m$,那么可以列出这样一个式子:

$$\begin{equation}ans=\sum_{k=0}^{m}(C_{n+m}^{n+k}-C_{n+m}^{n+k+1})(n-m+k)\end{equation}$$

一看就可以列项,化简以后得:

$$\begin{equation}ans=(n-m)C_{n+m}^{n}+\sum_{k=0}^{m-1}C_{n+m}^{k}\end{equation}$$

$n\leq m$同理,此时k从m-n开始,化简以后得:

$$\begin{equation}ans=\sum_{k=0}^{n-1}C_{n+m}^k\end{equation}$$

于是我们只需处理$\sum_{k=0}^{n}C_n^k$。设为$F(n,k)$,注意到$C_n^m=C_{n-1}^m+C_{n-1}^{m-1}$,所以$F(n+1,k)=2F(n,k)-C_n^k$;同时$F(n,k+1)=F(n,k)+C_n^{k+1}$。

发现每次n±1/k±1的时候都可以快速维护F(n,k),可以莫队维护(或者分块预处理组合数)。

并不是一定要长得像区间的东西才能用莫队维护。二维的且每次行列变化1后的结果能快速得到的量,也可以抽象成莫队问题。(听说莫队常数比分块来得小)

复杂度$\mathcal{O}(n\sqrt{n})$。(理解了我半天)

code:

(bzoj卡常并不能过)

 #include<bits/stdc++.h>
#define rep(i,x,y) for (int i=(x);i<=(y);i++)
#define per(i,x,y) for (int i=(x);i>=(y);i--)
#define ll long long
#define inf 1000000001
#define y1 y1___
using namespace std;
char gc(){
static char buf[],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
}
//#define gc getchar
ll read(){
char ch=gc();ll x=;int op=;
for (;!isdigit(ch);ch=gc()) if (ch=='-') op=-;
for (;isdigit(ch);ch=gc()) x=(x<<)+(x<<)+ch-'';
return x*op;
}
#define N 250005
#define mod 1000000007
#define inv2 500000004
int Q,fac[N],inv[N],ans[N];
struct ask{int n,m,l,r,id,bl;}q[N];
int ksm(int x,int p){
int ret=;
for (;p;p>>=,x=(ll)x*x%mod) if (p&) ret=(ll)ret*x%mod;
return ret;
}
void init(int n){
fac[]=;
rep (i,,n) fac[i]=(ll)fac[i-]*i%mod;
inv[n]=ksm(fac[n],mod-);
per (i,n-,) inv[i]=(ll)inv[i+]*(i+)%mod;
}
bool cmp(ask x,ask y){return x.bl<y.bl||x.bl==y.bl&&x.r<y.r;}
#define C(n,m) (n>=m?(ll)fac[n]*inv[m]%mod*inv[(n)-(m)]%mod:0)
#define invC(n,m) ((ll)fac[m]*fac[(n)-(m)]%mod*inv[n]%mod)
void upd(ll &x,int y){x+=y;x-=x>=mod?mod:;}
int main(){
init();
Q=read();read();int blo=sqrt(Q);
rep (i,,Q){
q[i].n=read(),q[i].m=read();
q[i].id=i;
q[i].l=q[i].n+q[i].m;q[i].r=min(q[i].n,q[i].m)-;
q[i].bl=(q[i].l-)/blo+;
}
sort(&q[],&q[Q+],cmp);
int l=,r=;ll now=;
rep (i,,Q){
while (l>q[i].l) l--,upd(now,C(l,r)),now=(ll)now*inv2%mod;
while (r<q[i].r) r++,upd(now,C(l,r));
while (l<q[i].l) upd(now,now),upd(now,mod-C(l,r)),l++;
while (r>q[i].r) upd(now,mod-C(l,r)),r--;
ans[q[i].id]=(max(q[i].n-q[i].m,)+now*invC(q[i].l,q[i].n))%mod;
}
rep (i,,Q) printf("%d\n",ans[i]);
return ;
}

loj6300 「CodePlus 2018 3 月赛」博弈论与概率统计的更多相关文章

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

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

  2. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...

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

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

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

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

  5. 【LibreOJ】#6298. 「CodePlus 2018 3 月赛」华尔兹 BFS

    [题意]给定n*m的网格,起点和终点位置,一些格指定下一步的方向,一些格任意.要求为方向任意的格确定方向,使起点可以走到终点.n,m<=50. [算法]BFS [题解]这道题最好用BFS,因为D ...

  6. 「CodePlus 2018 3 月赛」白金元首与莫斯科

    $n \leq 17,m \leq 17$,$n*m$的01矩形,对每一个0问:当他单独变成1之后,在其他0处放多米诺牌(不一定放满,可以不放)的方案数.膜$1e9+7$. 直接$dp$是$n^42^ ...

  7. 「CodePlus 2018 4 月赛」最短路

    $n \leq 100000$,$m \leq 500000$的有向图,两点之间还可以以$a \ \ xor \ \ b$的代价从$a$到$b$,问$s$到$t$的最短路. 被自己蠢哭QAQ 首先两个 ...

  8. loj #6302. 「CodePlus 2018 3 月赛」寻找车位【线段树+单调队列】

    考虑静态怎么做:枚举右边界,然后枚举上边界,对应的下边界一定单调不降,单调栈维护每一列从当前枚举的右边界向左最长空位的长度,这样是O(nm)的 注意到n>=m,所以m<=2000,可以枚举 ...

  9. 「CodePlus 2018 3 月赛」白金元首与克劳德斯

    所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重叠的面积 所有的云在此时没有重 ...

随机推荐

  1. C. Polygon for the Angle(几何)

    题目链接:http://codeforces.com/contest/1096/problem/C 题目大意:T是测试样例,然后每一次输入一个角度,然后问你在一个n边形里面,能不能构成这个角度,如果能 ...

  2. 利用python编写不同环境下都能运行的测试脚本

    利用bash来获取当前电脑的环境变量,可以写一个.sh文件,里面获取当前环境,然后在调用python文件执行 # -*- coding: utf-8 -*- import logging import ...

  3. Python基础(1):dir(),help()

    Python:3.6.4 开始编写Python程序了...可是,某个模块怎么用呢?模块里的函数怎么用呢?...使用本文介绍的dir().help()两个帮助函数可以 获得绝大部分开发所需要的信息! d ...

  4. 170406回顾-SQL Server的smalldatetime类型比较

    在比较SQL Server的类型为smalldatetime字段时出现下面的错误:将 expression 转换为数据类型 smalldatetime 时出现算术溢出错误 正确的比较方法如下:将lon ...

  5. 【前端vue开发】Hbuilder配置Avalon、AngularJS、Vue指令提示

    偶尔也会研究一下前端内容,因为Hbuilder是基于eclipse开发的,所以用起来倍感亲切啊,而且在我尝试使用的几款前端开发工具中,Hbuilder的表现也是相当出色地,可以访问Huilder官网下 ...

  6. Linux下配置Samba服务器全过程

    Linux下配置Samba服务器全过程 user级别的samba的配置 http://www.linuxidc.com/Linux/2014-11/109234.htm http://www.linu ...

  7. 关于Eclipse连接sql server 2008的若干问题

    以下内容转自:https://www.cnblogs.com/skylarzhan/p/7619977.html Eclipse中使用SQL server 2008数据库 一.准备材料 要能够使用数据 ...

  8. 深度学习国外课程资料(Deep Learning for Self-Driving Cars)+(Deep Reinforcement Learning and Control )

    MIT(Deep Learning for Self-Driving Cars) CMU(Deep Reinforcement Learning and Control ) 参考网址: 1 Deep ...

  9. 配置sql server 2000以允许远程访问

    配置sql server 2000以允许远程访问适合故障:1. 用sql企业管理器能访问sql server 2000(因为它是采用命名管道(named pipes)方式进行方式),但用ado.net ...

  10. 浅析redux

    一 redux 思想 首先,每一个webApp有且只有一个state tree,为方便管理和跟踪state的变化,也为了减少混乱,redux只允许通过发送(dispatch)action的方式来改变s ...