51nod1667 概率好题
一个数,数据组数(T<=5)
对于每组数据 输入顺序为
k1 L1 R1...Lk1 Rk1
k2 L1 R1...Lk2 Rk2
(k1,k2<=8,1<=L<=R<=10^7)
甲胜、平局、乙胜的概率。
(显然这个概率是有理数,记为p/q,则输出答案为(p/q)%(1e9+7))(逆元)
1
1 1 2
1 1 4
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 概率好题的更多相关文章
- 51nod 1667 概率好题
Description: 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2 ...
- 【CF913F】Strongly Connected Tournament 概率神题
[CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...
- 概率好题 Light OJ 1027
题目大意:你在迷宫里,有n扇门,每个门有一个val,这个val可正可负,每次通过一扇门需要abs(x)分钟,如果这个门的val是正的,那么就直接出了迷宫,否则回到原地,问出去迷宫的期望是多少? 思路: ...
- A - Arcade Game Gym - 100814A (概率思维题)
题目链接:https://cn.vjudge.net/contest/285964#problem/A 题目大意:每一次给你你一个数,然后对于每一次操作,可以将当前的数的每一位互换,如果互换后的数小于 ...
- 51Nod 1667 概率好题 - 容斥原理
题目传送门 无障碍通道 有障碍通道 题目大意 若$L_{i}\leqslant x_{i} \leqslant R_{i}$,求$\sum x_{i} = 0$以及$\sum x_{i} < 0 ...
- LightOJ 1218 概率水题(几何分布)
题意:给你一个n面骰子,问你投出所有面需要的次数的期望值是多少. 题解:放在过去估计秒解,结果现在自己想好久,还查了下,有人用极限证明...实际上仔细想想这种情况投出与前面不一样的概率p的倒数就是次数 ...
- 集训第六周 数学概念与方法 概率 N题
N - 概率 Time Limit:4000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Status ...
- 集训第六周 数学概念与方法 概率 F题
Submit Status Description Sometimes some mathematical results are hard to believe. One of the common ...
- 【51nod 1667】概率好题
题目 甲乙进行比赛. 他们各有k1,k2个集合[Li,Ri] 每次随机从他们拥有的每个集合中都取出一个数 S1=sigma甲取出的数,S2同理 若S1>S2甲胜 若S1=S2平局 否则乙胜 分别 ...
随机推荐
- Android开发技巧--Application, ListView排列,格式化浮点数,string.xml占位符,动态引用图片
一. Application用途 1. Application用途 创建Application时机 : Application在启动的时候会调用Application无参的构造方法创建实例; Appl ...
- JavaScript初探系列之Ajax应用
一 什么是Ajax Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对现有技术的一种新的应用,不 ...
- HashMap get()返回值问题
问题描述:在进行mysql查询必要字段后,需要根据id进行es其它数据字段的查询拼接.使用HashMap以id为key 以查询过来的数据值为value. 代码如下: Map<String,Int ...
- LintCode-35.翻转链表
翻转链表 翻转一个链表 样例 给出一个链表 1->2->3->null ,这个翻转后的链表为 3->2->1->null 挑战 在原地一次翻转完成 标签 链表 优步 ...
- Vue于React特性简单对比(一)
一,对象实体对比 vue的对象实体依然是html,而react的对象实体已经变味jsx,一种新的语法结构. vue的html与react的jsx都可以进行拆分,拆分成更细小的组件,组件之间可以传值. ...
- matlab读图函数
最基本的读图函数:imread imread函数的语法并不难,I=imread('D:\fyc-00_1-005.png');其中括号内写图片所在的完整路径(注意路径要用单引号括起来).I代表这个图片 ...
- 【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 ...
- BZOJ 1509 逃学的小孩(树的直径)
题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...
- 【bzoj4715】囚人的旋律 dp
题目描述 给你一个 $1\sim n$ 的排列 $a_i$ ,若 $i\le j$ 且 $a_i\ge a_j$ ,则 $i$ 到 $j$ 有一条边.现在给你这张图,求既是独立集(任意两个选定点都没有 ...
- 【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 ...