出题人的女装(牛客练习赛38题B) (概率+分式运算)

链接: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=1000010;
const int inf=0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
ll n,m,x,y,t;
ll gcd(ll a,ll b)
{
    if(b==0)
    {
        return a;
    }else
    {
        return gcd(b,a%b);
    }

}
ll ABS(ll x) {
    return x<0 ? -x : x;
}
struct F {
    ll num,den;// fenzi -> num  fenmu-> den
    F(ll num=0,ll den=1) {
        if(den<0) 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==0)
    {
        double ans=((x-1)*1.0*x/(n*(n-1))+(y*(y-1)*1.000/(m*(m-1))));
        ans=ans/(1.0*x/n+1.0*y/m);
        printf("%.3lf\n",ans);
    }else
    {
        F fz = (F(x,n)*F(x-1,n-1))  + (F(y,m)*F(y-1,m-1));
        F fm = F(x,n) + F(y,m);
        F  ans = fz/fm;
        cout<<(long long )ans.num<<'/'<<(long long )ans.den<<endl;

    }
    return 0;
}

inline void getInt(int* p) {
    char ch;
    do {
        ch = getchar();
    } while (ch == ' ' || ch == '\n');
    if (ch == '-') {
        *p = -(getchar() - '0');
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 - ch + '0';
        }
    }
    else {
        *p = ch - '0';
        while ((ch = getchar()) >= '0' && ch <= '9') {
            *p = *p * 10 + ch - '0';
        }
    }
}
 
 

猜你喜欢

转载自www.cnblogs.com/qieqiemin/p/10290223.html