基准时间限制: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. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  2. Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  3. Scala快速入门-基本数据结构

    模式匹配 使用用模式匹配实现斐波那契 def fibonacci(in: Any): Int = in match { case 0 => 0 case 1 => 1 case n: In ...

  4. 【alpha】Scrum站立会议第3次....10.18

    小组名称:nice! 小组成员:李权 于淼 杨柳 刘芳芳 项目内容:约跑app(约吧--暂定) 1.任务进度 2.燃尽图 功能列表 1.登录注册 2.创建跑步计划 3.筛选跑友 4.加一起跑步的人为好 ...

  5. CentOS 7 开放防火墙端口

    我:最近在使 CentOS 7时发现在本地不能访问linux上8080端口,以上是我的操作,修改后访问成功 CentOS 7 开放防火墙端口 命令 最近公司新的server要求用CentOS7, 发现 ...

  6. phpcms找不到模板、空白模板的解决办法

    有时候会出现这个问题,尤其是在调试模板的过程中,不知道别的朋友的操作习惯.我的习惯是,先保留一份原始的模板.比如: index原版.html. 以便对比之用.但是呢,这样,往往会造成 找不到模板的情况 ...

  7. spring cloud 之 客户端负载均衡 Ribbon

    一.负载均衡 负载均衡(Load Balance): 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用性.其意 ...

  8. BZOJ4765 普通计算姬(分块+树状数组)

    对节点按编号分块.设f[i][j]为修改j号点对第i块的影响,计算f[i][]时dfs一遍即可.记录每一整块的sum.修改时对每一块直接更新sum,同时用dfs序上的树状数组维护子树和.查询时累加整块 ...

  9. Javascript-基础1

    1,变量: name="alex"  #默认是全局变量 var name="eric" #局部变量 2. 写JS代码:---html中写,---临时文件可以写在 ...

  10. POJ2187:Beauty Contest——题解

    http://poj.org/problem?id=2187 题目大意:给n个点,求点对最大距离的平方. ———————————————————— 很容易证明最大距离的点对在最大凸包上. 那么就是旋转 ...