点此看题面

大致题意: 已知主队每秒进球概率为\(p\),客队每秒进球概率为\(q\),求主队进球数大于客队的概率。

推式子

考虑枚举主队进球数\(i\),则客队进球数必然小于\(i\),因此可再枚举一个\(j\)表示客队进球数。

显然,主队进球数为\(i\)的概率应为\(p^i(1-p)^{n-i}\),同理客队进球数为\(j\)的概率应为\(q^j(1-q)^{n-j}\)。

而哪\(i\)场或哪\(j\)场进球是任意的,所以两式应各乘上一个组合数\(C_n^i\)和\(C_n^j\)。

所以就可以得到这样一个式子:

\[\sum_{i=1}^np^i(1-p)^{n-i}C_n^i\sum_{j=0}^{i-1}q^j(1-q)^{n-j}C_n^j
\]

\(O(n)\)求值

注意到\(n\le10^7\),所以我们需要一边枚举\(i\),一边同时统计这个式子的值,这其实是可以实现的。

我们用\(p_1\)存储\(p^i\),\(p_2\)存储\((1-p)^{n-i}\),\(q_1\)存储\(q^j\),\(q_2\)存储\((1-q)^{n-j}\),\(sq\)存储\(\sum_{j=0}^{i-1}q^j(1-q)^{n-j}C_n^j\),\(ans\)存储答案。

初始化\(p_1=1,p_2=(1-p)^n,q_1=\frac1q,q_2=(1-q)^{n+1},sq=ans=0\)。

然后定义两个常量\(tp\)和\(tq\)分别存储\(\frac1{1-p}\)和\(\frac1{1-q}\)。

每次操作时,将\(p_1\)乘上\(1\),\(p_2\)乘上\(tp\),\(q_1\)乘上\(q\),\(q_2\)乘上\(tq\),\(sq\)加上\(q_1q_2C_n^{i-1}\),\(ans\)加上\(p_1*p_2*C_n^i*sq\)即可。

关于内存

这道题内存其实是卡得很紧的,而\(n\le10^7\),差不多只能开一个数组。

但光组合数就需要阶乘和阶乘逆元两个数组啊!

不过,注意到此题中的组合数都是\(C(n,x)\)的格式,因此所需用到的阶乘只有\(n!\),这可以直接预处理。然后就只需要一个阶乘逆元的数组即可。

某些特判

上面的式子,在某些特殊情况下其实是过不去的。

  1. \(p=0\)时,需直接输出\(0\)。
  2. \(q=0\)时,需输出\(1-(1-p)^n\),即除非主队一球不进,否则必胜。
  3. \(p=1\)时,需输出\(1-q^n\),即除非客队全进,否则必胜。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 10000000
#define X 1000000007
#define Qinv(x) Qpow(x,X-2)
#define C(x) (1LL*Fn*Inv[x]%X*Inv[n-(x)]%X)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,p,q,Fn,Inv[N+5];
I int Qpow(RI x,RI y) {RI res=1;W(y) y&1&&(res=1LL*res*x%X),x=1LL*x*x%X,y>>=1;return res;}
I int XSub(RI x,CI y) {return (x-=y)<0&&(x+=X),x;}
int main()
{
RI i,x,y,ans=0;scanf("%d%d%d",&n,&x,&y),p=1LL*x*Qinv(y)%X,scanf("%d%d",&x,&y),q=1LL*x*Qinv(y)%X;//读入数据
if(!p) return putchar('0'),0;if(!q) return printf("%d",XSub(1,Qpow(XSub(1,p),n))),0;//特判p=0或q=0的情况
if(!(p^1)) return printf("%d",XSub(1,Qpow(q,n))),0;//特判p=1的情况
for(Fn=i=1;i<=n;++i) Fn=1LL*Fn*i%X;for(Inv[n]=Qinv(Fn),i=n-1;~i;--i) Inv[i]=1LL*Inv[i+1]*(i+1)%X;//预处理n!和阶乘逆元
RI tp=Qinv(XSub(1,p)),tq=Qinv(XSub(1,q)),p1=1,p2=Qpow(XSub(1,p),n),q1=Qinv(q),q2=Qpow(XSub(1,q),n+1),sq=0;//初始化变量
for(i=1;i<=n;++i)//O(n)求值
{
p1=1LL*p1*p%X,p2=1LL*p2*tp%X,q1=1LL*q1*q%X,q2=1LL*q2*tq%X,Inc(sq,1LL*q1*q2%X*C(i-1)%X),//更新数据
Inc(ans,1LL*p1*p2%X*C(i)%X*sq%X);//更新答案
}return printf("%d",ans),0;//输出答案
}

【LOJ6513】「雅礼集训 2018 Day10」足球大战(数学题)的更多相关文章

  1. 「雅礼集训 2018 Day10」贪玩蓝月

    题目链接 题意分析 我们考虑维护两个栈 分别支持左边的插入删除以及右边的插入删除 然后对于两两个栈的我们需要用背包求出最优答案 注意 删除时如果不够的话 我们需要从另一个栈中取出一半加入另一个栈中 注 ...

  2. loj #6515. 「雅礼集训 2018 Day10」贪玩蓝月

    \(\color{#0066ff}{输入样例}\) 0 11 10 QU 0 0 QU 1 9 IG 14 7 IF 3 5 QU 0 9 IG 1 8 DF QU 0 4 IF 1 2 DG QU ...

  3. 【线段树分治 01背包】loj#6515. 「雅礼集训 2018 Day10」贪玩蓝月

    考试时候怎么就是没想到线段树分治呢? 题目描述 <贪玩蓝月>是目前最火爆的网页游戏.在游戏中每个角色都有若干装备,每件装备有一个特征值 $w$ 和一个战斗力 $v$ .在每种特定的情况下, ...

  4. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  5. 「雅礼集训 2018 Day2」农民

    传送门 Description  「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却 ...

  6. 【loj - 6516】「雅礼集训 2018 Day11」进攻!

    目录 description solution accepted code details description 你将向敌方发起进攻!敌方的防御阵地可以用一个 \(N\times M\) 的 \(0 ...

  7. LOJ #6509. 「雅礼集训 2018 Day7」C

    神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...

  8. LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]

    题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...

  9. LOJ#6049. 「雅礼集训 2017 Day10」拍苍蝇(计算几何+bitset)

    题面 传送门 题解 首先可以用一个矩形去套这个多边形,那么我们只要枚举这个矩形的左下角就可以枚举完所有多边形的位置了 我们先对每一个\(x\)坐标开一个\(bitset\),表示这个\(x\)坐标里哪 ...

随机推荐

  1. Netcore中实现字段和属性注入

    https://www.cnblogs.com/loogn/p/10566510.html 简单来说,使用Ioc模式需要两个步骤,第一是把服务注册到容器中,第二是从容器中获取服务,我们一个一个讨论并演 ...

  2. vue 中的 ... (三个点的用法)

    这个是扩展运算符. 扩展语法.对数组和对象而言,就是将运算符后面的变量里东西每一项拆下来.这个东西可以在函数定义的地方使用,比如使用func(...args)将函数传入的参数都放到args数组里.

  3. python_字典 学习

    一.创建字典(关联数组或hash表) 字典由键(key)和对应的值(values)组成. 代码: dic = { ‘ name‘:1 , ‘ zhang ’:2 , ‘ age‘ :3 , ‘ sex ...

  4. Linux下判断磁盘是SSD还是HDD的几种方法

    环境介绍 Fedora release 25 (Twenty Five) 判断方法 方法一 判断cat /sys/block/*/queue/rotational的返回值(其中*为你的硬盘设备名称,例 ...

  5. Java基础11-数组

    1.使用数组步骤: (1)声明数组 int[] a; (2)分配空间 a=new int[5]; (3)赋值 a[0]=1;  int类型数组如果没有赋值,默认值为0,String类型数组默认为nul ...

  6. 性能测试工具LoadRunner01-性能测试基础

    什么是性能测试? 在一定的约束条件下(指定的软件.硬件.网络环境等)对产品按一定的性能指标进行测试,确定系统能承受的最大负载压力,解决性能瓶颈.给用户最好的体验. 性能测试流程? 什么时候开始性能测试 ...

  7. Python 的命名空间

    Python命名空间的本质: 一.命名空间的定义: 二.命名空间的查找顺序: 三.命名空间的生命周期: 四.通过locals()和globals() BIF访问命名空间. 重点是第四部分,我们将在此部 ...

  8. [Android]JsonObject解析

    android和服务器进行交互的时候往往会有数据的传输,而数据中有一种类型就是Json型,这两天在研究API接口的问题,服务器返回的数据类型都是Json型的.例如: 1.接收到的json字符串分为两种 ...

  9. pat06-图4. Saving James Bond - Hard Version (30)

    06-图4. Saving James Bond - Hard Version (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作 ...

  10. java实现连接mysql数据库单元测试查询数据项目分享

    1.按照javaweb项目的要求逐步建立搭建起机构,具体的类包有:model .db.dao.test;具体的架构详见下图: 2.根据搭建的项目架构新建数据库test和数据库表t_userinfo并且 ...