链接:https://ac.nowcoder.com/acm/contest/358/B
来源:牛客网

出题人的女装
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld

题目描述

出题人早上起床就打算穿衣服,他有两箱衣服,因为懒,他在这两天只打算打开一个箱子.
两个箱子中一个有n件衣服,其中有x件女装,另一个有m件衣服,其中有y件女装.
出题人在第一天随机挑一个箱子后,接下来的两天就会从此箱子中随机找一件衣服穿.

又因为出题人懒而且很有钱,所以他穿完衣服后不会去洗,而是直接扔进垃圾桶,也不会放回原来的箱子.

已知出题人第1天穿了女装,求他第二天依然穿女装的概率

输入描述:

第一行包含5个整数n,m,x,y,t

输出描述:

若t=0,则在第一行输出概率(四舍五入保留小数点后3位,概率为0输出0.000,概率为100%输出1.000)
若t=1,则在第一行输出概率(最简分数形式,概率为0输出0/1,概率为100%输出1/1)
示例1

输入

10 10 8 8 1

输出

7/9

备注:

2<=n,m<=10000
2<=x<=n且2<=y<=m
链接:https://ac.nowcoder.com/acm/contest/358/B
来源:牛客网
中文题意自行阅读。
这个概率问题还是有点坑的,首先出题人第一天穿了是女装,那么他在用哪个箱子的概率不是1:1平等的,而是根据箱子中女装概率的比例来的。
此处引用官方题解:
由于已知第一天穿了女装,那么选取两个箱子的概率不是1:1了 Ans=P(两次都取到女装)/P(第一次取到女装) P(两次都取到女装)= P(第一次取到女装)= 因为分子分母都有 ,编程的时候可以忽略,减少代码复杂度. 又由于和善的数据 范围,只要long long暴力求分子分母然后化简即可 这是一个叫贝叶斯定理的东西,有兴趣的可以上网查一查
本人用直接用的封装好的可以分式运算的结构体(很方便)。不会爆longlong,直接写了。
x细节见我的ac代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== "<<x<<" =="<<endl;
using namespace std;
//typedef __int128 ll;
typedef long long ll;
inline void getInt(int* p);
const int maxn=;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
ll n,m,x,y,t;
ll gcd(ll a,ll b)
{
if(b==)
{
return a;
}else
{
return gcd(b,a%b);
} }
ll ABS(ll x) {
return x< ? -x : x;
}
struct F {
ll num,den;// fenzi -> num fenmu-> den
F(ll num=,ll den=) {
if(den<) num=-num,den=-den;
ll g = gcd(ABS(num),den);
this->num = num/g;
this->den = den/g;
}
F operator+(const F &o)const {
return F(num*o.den + den*o.num, den*o.den);
}
F operator*(const F &o)const {
return F(num*o.num , den*o.den);
}
F operator/(const F &o) const {
return F(num*o.den,den*o.num);
}
};
int main()
{
cin>>n>>m>>x>>y>>t;
if(t==)
{
double ans=((x-)*1.0*x/(n*(n-))+(y*(y-)*1.000/(m*(m-))));
ans=ans/(1.0*x/n+1.0*y/m);
printf("%.3lf\n",ans);
}else
{
F fz = (F(x,n)*F(x-,n-)) + (F(y,m)*F(y-,m-));
F fm = F(x,n) + F(y,m);
F ans = fz/fm;
cout<<(long long )ans.num<<'/'<<(long long )ans.den<<endl; }
return ;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '');
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * - ch + '';
}
}
else {
*p = ch - '';
while ((ch = getchar()) >= '' && ch <= '') {
*p = *p * + ch - '';
}
}
}
05-02 12:49