LOJ6300 BZOJ5283 [CodePlus 2018 3 月赛]博弈论与概率统计
一道好题!很久以前就想做了,咕到了现在,讲第二遍了才做。
首先我们观察到$p$是没有用的 因为赢的次数一定 那么每一种合法序列出现的概率均为$p^n*(1-p)^m$ 是均等的 我们可以不看它了
然后我们可以通过计算所有序列的答案再除以$C_{n+m}^n$就可以了
然后我们开始进行神奇操作
赢的话就是+1输的话就是-1 那么我们可以观察到最后的结果就是$n-m-min \left (s_i \right )$ 其中s表示前缀和
那么我们有答案就是$C_{n+m}^n \left (n-m \right ) - min \left (s_i \right )$ 其中第一项直接解决 我们考虑处理第二项
第二项我们用一个$f[x]$来表示 最小值为$x$的方案数 这个玩意直接求并不好求 那么我们考虑利用差分性来求
我们再设$g[x]$表示最小值$<=x$的方案数 于是$f[x]=g[x]-g[x-1]$
考虑求数组$g$
我们发现这个数列的转移只有两种 $(x,y)->(x+1,y+1)$ 或者 $(x,y)->(x+1,y-1)$ 分别对应着Alice赢和Bob赢
如果一个序列的最小值$<=k$那么它一定会有一部分位于$y=k$上/以下 接下来继续思考
如果我们把第一次接触到$y=k$的点以后的图像翻转 那么最后一个节点的坐标就是$\left ( n+m,2*k-n+m\right )$
这样的话我们就可以得到比较优美的性质 就是Alice赢了$k+m$次 Bob赢了$n-k$次
那么显然这样的折线应该是有$C_{n+m}^{m+k}$个 于是可以得到$g[x]=C_{n+m}^{m+k}$ 推到$f[x]=C_{n+m}^{m+k}-C_{n+m}^{m+k-1}$
继续向下推导
首先发现n>=m 和 n<m是不一样的 因为前者的最小值区间是$\left[-m,0\right]$ 后者是$\left[-m,n-m\right]$
这两类是不一样的于是我们分类讨论
对于第一种我们如下推导
$ans=(n-m)C_{n+m}^n-x*f[x]$
$ans=(n-m)C_{n+m}^n-\sum_{x=-m}^0 C_{n+m}^{m+x} - C_{n+m}^{m+x-1}$
$ans=(n-m)C_{n+m}^n+\sum_{x=0}^m C_{n+m}^{m-x} - C_{n+m}^{m-x-1}$
$ans=(n-m)C_{n+m}^n+\sum_{x=0}^m x*C_{n+m}^{m-x} - \sum _{x=0}^{m-1} x*C_{n+m}^{m-x-1}$
$ans=(n-m)C_{n+m}^n+\sum_{x=0}^{m-1}C_{n+m}^{m-x-1}$
$ans=(n-m)C_{n+m}^n +\sum_{x=0}^{m-1}C_{n+m}^x $
对于n<m我在这里留给读者自行推导 (才不是因为我懒
最后的柿子也很相似
$ans=\sum_{x=0}^{n-1} C_{n+m}^x$
然后我们就落到了最后一个问题
组合数前缀和怎么算= =
这是一个常见问题
我们有
$\sum_{x=0}^m C_{m+1}^x = \sum _{x=0}^{m}(C_n^x + C_n^{x-1})=(2*\sum_{x=0}^m C_n^x)-C_n^m$
详细理解请参照杨辉三角
然后呢 我们惊奇的发现 特么多组询问!!!
这个咋整呢
我们可以利用莫队来做 我们对于组合数前缀和可以$O(1)$转化了 那么 我们就可以愉快的套上莫队美滋滋
在这里我遇到了一点小问题 就是在初始化的地方 如果id循环到N就是可以过的 循环到T是会T的 具体情况我也不知道
感觉和底层优化? 或者计算机硬件有关? 这个如果有神仙知道为什么的话请一定联系我!会超级感谢!
这个题整体思路都很神仙 大概不看的话是完全想不到的 用莫队来做组合数前缀和很久以前也就听说过了 在这里第一次使用到
还有此题略微卡常 虽然我没遇到 但是前面那个小问题还是卡了很久 看了标程对着才改到 所以这个题还是可以多看看学习一下的
最后的复杂度是$O((n+m)\sqrt(n+m))$
不清楚为什么大家块大小都取的477 跟风一波。
代码扔这里了。
//Love and Freedom.
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define ll long long
#define inf 20021225
#define N 250001
#define B 477
#define mdn 1000000007
using namespace std;
int read()
{
int s=,f=; char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='') s=s*+ch-'',ch=getchar();
return f*s;
}
int ksm(int bs,int mi)
{
int ans=;
while(mi)
{
if(mi&) ans=1ll*ans*bs%mdn;
bs=1ll*bs*bs%mdn; mi>>=;
}
return ans;
}
struct node
{
int l,r,id;
node(){}
node(int _l,int _r,int _id){l=_l,r=_r,id=_id;}
}k[N],a[N];
int id[N],fac[N],inv[N],ans,fin[N],T;
void add(int &x,int y){x=x+y>=mdn?x+y-mdn:x+y;}
void sub(int &x,int y){x=x-y<?x-y+mdn:x-y;}
bool cmp(node a,node b)
{
if(id[a.l]==id[b.l]) return a.r<b.r;
return id[a.l]<id[b.l];
}
int C(int n,int m)
{
if(n<m) return ;
return 1ll*fac[n]*inv[m]%mdn*inv[n-m]%mdn;
}
int invC(int n,int m)
{
if(n<m) return ;
return 1ll*inv[n]*fac[m]%mdn*fac[n-m]%mdn;
}
void upd(int n,int m,int f)
{
if(f==) add(ans,ans),sub(ans,C(n,m));
else if(f==) add(ans,C(n-,m)),ans=1ll*ans*inv[]%mdn;
else if(f==) add(ans,C(n,m+));
else sub(ans,C(n,m));
}
void solve()
{
for(int i=;i<N;i++) id[i]=i/B+;
sort(k+,k+T+,cmp); int n=,m=; ans=;
for(int i=;i<=T;i++)
{
while(n<k[i].l) upd(n++,m,);
while(n>k[i].l) upd(n--,m,);
while(m<k[i].r) upd(n,m++,);
while(m>k[i].r) upd(n,m--,);
add(fin[k[i].id],ans);
}
}
int main()
{
T=read(); int p=read();
fac[]=;
for(int i=;i<N;i++) fac[i]=1ll*fac[i-]*i%mdn;
inv[N-]=ksm(fac[N-],mdn-);
for(int i=N-;i;i--) inv[i-]=1ll*inv[i]*i%mdn;
for(int i=;i<=T;i++)
{
int n=read(),m=read(); a[i].l=n,a[i].r=m;
if(n>=m) fin[i]=1ll*(n-m)*C(n+m,n)%mdn,k[i]=node(n+m,m-,i);
else k[i]=node(n+m,n-,i);
}
solve();
for(int i=;i<=T;i++)
{
int tmp=1ll*fin[i]*invC(a[i].l+a[i].r,a[i].r)%mdn;
printf("%d\n",tmp);
}
return ;
}
LOJ6300 BZOJ5283 [CodePlus 2018 3 月赛]博弈论与概率统计的更多相关文章
- bzoj 5283: [CodePlus 2018 3 月赛]博弈论与概率统计
Description 大家的好朋友小 L 来到了博弈的世界.Alice 和 Bob 在玩一个双人游戏.每一轮中,Alice 有 p 的概率胜利,1 -p 的概率失败,不会出现平局.双方初始时各有 0 ...
- [CodePlus 2018 3 月赛] 博弈论与概率统计
link 题意简述 小 $A$ 与小 $B$ 在玩游戏,已知小 $A$ 赢 $n$ 局,小 $B$ 赢 $m$ 局,没有平局情况,且赢加一分,输减一分,而若只有 $0$ 分仍输不扣分. 已知小 $A$ ...
- 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 ...
- 【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 ...
- 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 ...
- 「CodePlus 2018 3 月赛」白金元首与莫斯科
$n \leq 17,m \leq 17$,$n*m$的01矩形,对每一个0问:当他单独变成1之后,在其他0处放多米诺牌(不一定放满,可以不放)的方案数.膜$1e9+7$. 直接$dp$是$n^42^ ...
随机推荐
- Fabric基础架构原理(一)
Linux基金会于2015年12月启动了名为“超级账本”(Hyperledger)的开源项目,旨在推动各方协作,共同打造基于区块链的企业级分布式账本底层技术,用于构建支撑业务的行业应用和平台. 超级账 ...
- vue2.0 之 douban (一)框架搭建 及 整体布局
1.创建豆瓣项目 我们通过官方vue-cli初始化项目 vue init webpack douban 填写项目描述,作者,安装vue-router 初始化后,通过npm install安装依赖 cd ...
- Linux下查看分区内目录及文件占用空间容量
转载linux下使用 du查看某个文件或目录占用磁盘空间的大小 du -ah --max-depth=1 这个是我想要的结果 a显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘 ...
- (转)oracle触发器使用:after insert 与before insert的简单使用注意
本文转载自:http://blog.csdn.net/kuangfengbuyi/article/details/41446125 创建触发器时,触发器类型为after insert , 在begin ...
- truncate()函数
1 truncate()方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符,截断之后 size 后面的所有字符被删除. 参考: https://www.runoob.c ...
- 《计算机程式设计》Week4 课堂笔记
本笔记记录自 Coursera课程 <计算机程式设计> 台湾大学 刘邦锋老师 Week4 Functions 4-1 System Function 函数主要分为两大类系统定义函数与使用者 ...
- SQLServer中的top、MySql中的limit、Oracle中的rownum
(1)在SQL Server中,我们使用 select top N * from tablename来查询tablename表中前N条记录. (2)在MySQL中,我们使用select * from ...
- 没看这篇干货,别和我说你会IDEA Debug
所谓工欲善其事必先利其器,现在idea已经成为java开发者眼中最热门最好用的IDE了.下面这篇文章将总结下idea调试的一些高级技巧. 多线程调试 直接上例子说明,比如下面这段代码 debug模式下 ...
- AngleSharp 网络数据采集 -- 使用AngleSharp做html解析
AngleSharp AngleSharp is a .NET library that gives you the ability to parse angle bracket bas ...
- 黑群晖DSM 6.x 配置文件grub.cfg修改 mac地址/sn等修改
新的DSM 6.x配置文件和以前的XPEnoboot的配置文件不一样了,我们可以通过OSFMount虚拟光驱软件打开img后再修改. 安装完成后运行OSFMount点击左下角-Mount new,选择 ...