基准时间限制: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开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片

    一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...

  2. JavaScript初探系列之Ajax应用

    一 什么是Ajax Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对现有技术的一种新的应用,不 ...

  3. HashMap get()返回值问题

    问题描述:在进行mysql查询必要字段后,需要根据id进行es其它数据字段的查询拼接.使用HashMap以id为key 以查询过来的数据值为value. 代码如下: Map<String,Int ...

  4. LintCode-35.翻转链表

    翻转链表 翻转一个链表 样例 给出一个链表 1->2->3->null ,这个翻转后的链表为 3->2->1->null 挑战 在原地一次翻转完成 标签 链表 优步 ...

  5. Vue于React特性简单对比(一)

    一,对象实体对比 vue的对象实体依然是html,而react的对象实体已经变味jsx,一种新的语法结构. vue的html与react的jsx都可以进行拆分,拆分成更细小的组件,组件之间可以传值. ...

  6. matlab读图函数

    最基本的读图函数:imread imread函数的语法并不难,I=imread('D:\fyc-00_1-005.png');其中括号内写图片所在的完整路径(注意路径要用单引号括起来).I代表这个图片 ...

  7. 【Asp.Net Core】ASP.NET Core 2.0 + EF6 + Linux +MySql混搭

    好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...

  8. BZOJ 1509 逃学的小孩(树的直径)

    题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...

  9. 【bzoj4715】囚人的旋律 dp

    题目描述 给你一个 $1\sim n$ 的排列 $a_i$ ,若 $i\le j$ 且 $a_i\ge a_j$ ,则 $i$ 到 $j$ 有一条边.现在给你这张图,求既是独立集(任意两个选定点都没有 ...

  10. 【bzoj3427】Poi2013 Bytecomputer dp

    题目描述 A sequence of N  integers I1,I2…In from the set {-1,0,1} is given. The bytecomputer is a device ...