基准时间限制:4 秒 空间限制:131072 KB 分值: 640 
甲乙进行比赛。

他们各有k1,k2个集合[Li,Ri]
每次随机从他们拥有的每个集合中都取出一个数
S1=sigma甲取出的数,S2同理
若S1>S2甲胜 若S1=S2平局 否则乙胜
分别求出甲胜、平局、乙胜的概率。
(显然这个概率是有理数,记为p/q,则输出答案为(p/q)%(1e9+7))(逆元)
注意 多组数据
Input
一个数,数据组数(T<=5)
对于每组数据 输入顺序为
 k1 L1 R1...Lk1 Rk1
k2 L1 R1...Lk2 Rk2
(k1,k2<=8,1<=L<=R<=10^7)
Output
甲胜、平局、乙胜的概率。
(显然这个概率是有理数,记为p/q,则输出答案为(p/q)%(1e9+7))(逆元)
Input示例
1
1 1 2
1 1 4
Output示例
125000001 250000002 625000005

数学问题 容斥

$[L_i,R_i]$的限制看上去很迷,不怎么好做。

如果能去掉下界的话,原问题似乎可以转化成容斥求方程解的个数的问题。

我们来试试去掉下界:

设前ki个集合为 $R_i - x_i$,后ki个集合为 $ L_i + x_i $

此时x的取值范围是 $[0,R_i - L_i]$

那么甲赢乙的情况需要满足的条件是:

$$\sum_{i=1}^{k_1} R_i-x_i > \sum_{j=1}^{k_2} L_j+y_j $$

$$\sum_{i=1}^{k_1} x_i + \sum_{j=1}^{k_2} y_j< \sum_{i=1}^{k_1} R_i -\sum_{j=1}^{k_2} L_j $$

我们惊喜地发现右边是常数,那么可以用组合数+容斥算方程解的个数辣

甲乙平手的情况,只需要把上面的大于换成等于号即可。

乙赢甲的情况,可以把上式取负计算解个数,也可以直接用总方案数减去前两问方案数。

总方案数当然就是所有的$R_i-L_i+1$的乘积

答案当然就是满足条件的方案数除以总方案数

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define LL long long
using namespace std;
const int mod=1e9+;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
return x*f;
}
int ksm(int a,int k){
int res=;
while(k){
if(k&)res=(LL)res*a%mod;
a=(LL)a*a%mod;
k>>=;
}
return res;
}
int fac[mxn*],inv[mxn*];
void init(){
int ed=mxn*;
fac[]=fac[]=;inv[]=inv[]=;
for(int i=;i<ed;i++){
fac[i]=(LL)fac[i-]*i%mod;
inv[i]=((-mod/i*(LL)inv[mod%i]%mod)+mod)%mod;
}
return;
}
int C(int n,int m){
if(m>n || n<)return ;
// return (LL)fac[n]*inv[m]%mod*inv[n-m]%mod;
int res=;
for(int i=;i<=m;i++){
res=(LL)res*(n-m+i)%mod;
}
for(int i=;i<=m;i++){
res=(LL)res*ksm(i,mod-)%mod;
}
return res;
}
int ans1,ans2,ans3;//1 2 0
int n,smm,lower=;
int k1,k2,L[mxn],R[mxn];
void calc(int pos,int f,int x){
if(pos>n){
ans1=((LL)ans1+f*C(smm-x+n-,n))%mod;
// printf("%d %d\n",smm-x+n-1,n);
ans2=((LL)ans2+f*C(smm-x+n-,n-))%mod;
// printf("%d\n",ans1);
return;
}
calc(pos+,-f,x+R[pos]-L[pos]+);
calc(pos+,f,x);
return;
}
int main(){
int i,j;
// init();
int T=read();
while(T--){
ans1=ans2=ans3=;
lower=;smm=;
k1=read();
for(i=;i<=k1;i++){
L[i]=read();R[i]=read();
smm+=R[i];
}
k2=read();
for(i=;i<=k2;i++){
L[i+k1]=read();R[i+k1]=read();
smm-=L[i+k1];
}
n=k1+k2;
for(i=;i<=n;i++)lower=(LL)lower*(R[i]-L[i]+)%mod;
calc(,,);
int INV=ksm(lower,mod-);
ans3=((LL)lower-ans1-ans2)*INV%mod;
ans1=(LL)ans1*INV%mod;
ans2=(LL)ans2*INV%mod;
ans1=(ans1+mod)%mod;
ans2=(ans2+mod)%mod;
ans3=(ans3+mod)%mod;
printf("%d %d %d\n",ans1,ans2,ans3);
}
return ;
}

设前ki个集合为 $R_i - x_i$,后ki个集合为 $ L_i + x_i $此时x的取值范围是 $[0,R_i - L_i]$那么甲赢乙的情况需要满足的条件是:$$\sum_{i=1}^{k_1} R_i-x_i > \sum_{j=1}^{k_2} L_j+y_j $$$$\sum_{i=1}^{k_1} x_i + \sum_{j=1}^{k_2} y_j< \sum_{i=1}^{k_1} R_i -\sum_{j=1}^{k_2} L_j $$我们惊喜地发现右边是常数,那么可以用组合数+容斥算方程解的个数辣甲乙平手的情况,只需要把上面的大于换成等于号即可。乙赢甲的情况,可以把上式取负计算解个数,也可以直接用总方案数减去前两问方案数。总方案数当然就是所有的$R_i-L_i+1$的乘积

51nod1667 概率好题的更多相关文章

  1. 51nod 1667 概率好题

    Description: 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2 ...

  2. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  3. 概率好题 Light OJ 1027

    题目大意:你在迷宫里,有n扇门,每个门有一个val,这个val可正可负,每次通过一扇门需要abs(x)分钟,如果这个门的val是正的,那么就直接出了迷宫,否则回到原地,问出去迷宫的期望是多少? 思路: ...

  4. A - Arcade Game Gym - 100814A (概率思维题)

    题目链接:https://cn.vjudge.net/contest/285964#problem/A 题目大意:每一次给你你一个数,然后对于每一次操作,可以将当前的数的每一位互换,如果互换后的数小于 ...

  5. 51Nod 1667 概率好题 - 容斥原理

    题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...

  6. LightOJ 1218 概率水题(几何分布)

    题意:给你一个n面骰子,问你投出所有面需要的次数的期望值是多少. 题解:放在过去估计秒解,结果现在自己想好久,还查了下,有人用极限证明...实际上仔细想想这种情况投出与前面不一样的概率p的倒数就是次数 ...

  7. 集训第六周 数学概念与方法 概率 N题

    N - 概率 Time Limit:4000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status ...

  8. 集训第六周 数学概念与方法 概率 F题

    Submit Status Description Sometimes some mathematical results are hard to believe. One of the common ...

  9. 【51nod 1667】概率好题

    题目 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2平局 否则乙胜 分别 ...

随机推荐

  1. java — JVM调优

    数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型.基本类型的变量保存原始值,即:他代表的值就是数值本身:而引用类型的变量保存引用值.“引用值”代表了某个对象的引用,而不是对象本身, ...

  2. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...

  3. <Effective C++>读书摘要--Designs and Declarations<二>

    <Item 20> Prefer pass-by-reference-to-const to pass-by-value 1.By default, C++ passes objects ...

  4. 【OpenGL】无法启动此程序,因为计算机中丢失 glut32.dll。尝试重新安装该程序以解决此问题。

    运行OpenGL程序的时候报错,如图: 解决方法:把glut32.dll复制到C:\Windows\SysWOW64目录下,而不是像网上教程那样复制到C:\Windows\System32目录下. 原 ...

  5. bootstrap列表添加滚动条

    有时候列表中数据过多,导致超出页面,影响视觉感受.这时我们需要添加一个滚动条. 初始状态如图: 代码如下: <ul class="list-group"> <li ...

  6. 3dContactPointAnnotationTool开发日志(四)

      没办法,为了能在寝室接着做这玩意只好又在电脑上装一个和实验室版本一样的unity了.虽然打开后UI界面还是一团糟,不过至少要的东西都在,又手动调了调UI界面.   然后把旋转视角功能加上了.鼠标右 ...

  7. animate.css与wow.js制作网站动效

    animate.css 官网:https://daneden.github.io/animate.css/ 包括:attention seekers:关注者 bouncing entrances:跳跃 ...

  8. TCP标志位简析

    TCP标志位简析   TCP标志位  URG:此标志表示TCP包的紧急指针域(后面马上就要说到)有效,用来保证TCP连接不被中断,并且督促中间层设备要尽快处理这些数据: ACK:此标志表示应答域有效, ...

  9. [OS] 信号量(Semaphore)

    一个信号量S是一个整型量,除对其初始化外,它只能由两个原子操作P和V来访问.P和V的名称来源于荷兰文proberen(测试)和verhogen(增量),后面亦将P/V操作分别称作wait(), sig ...

  10. 前端基础:CSS样式选择器

    前端基础:CSS样式选择器 CSS概述 CSS是Cascading Style Sheets的简称,中文意思是:层叠样式表,对html标签的渲染和布局.CSS规则由两个主要的部分组成:1.选择器:2. ...