问题 : 这里是天堂!

时间限制: 1 Sec  内存限制: 128 MB

题目描述

Maple他打代码打累了,于是Maple跑去找猫猫们来拯救自己。

Maple来到了一个空房间里,房间的隔壁是一个有很多只猫猫的房间,在Maple的房间里有一个按钮,每次按一下按钮,就会有且只有一只猫猫从旁边的房间里跑过来找Maple玩,当然当隔壁房间没有猫的时候并不会有猫猫跑过来。

Maple按了几次按钮后发现跑过来的猫猫只有白色和黄色两种毛色,而且如果假设当每次按按钮后旁边房间剩下的猫跑过来的概率都相同,那么Maple就开始想,如果当隔壁房间共有n只白猫和m只黄猫时,当他按了k次按钮后,跑过来的白猫数量和黄猫数量分别为a只和b只的概率是多少。

输入

第一行有一个整数T,代表有T组数据(1<=T<=2000)

每组数据有五个整数n,m,k,a,b,其中0<=n,m,k,a,b<=10

输出

对于每组数据,得到的概率为一个分数A/B(A<=B且AB为互质整数),输出两个整数A、B,用一个空格分开。

样例输入

2
1 1 1 1 0
9 1 10 9 1

样例输出

1 2
1 1

提示

特殊的,概率为0的分数表示法为0/1。

#include <stdio.h>
#define ll long long
ll gcd(ll a, ll b)
{
    return b ? gcd(b, a % b) : a;
}
ll C(ll m, ll n)
{
    if (n == 0)
        return 1;
    ll num1 = 1, num2 = 1;
    for (int i = 1; i <= n; i++)
    {
        num1 *= (m - i + 1);
        num2 *= i;
    }
    return num1 / num2;
}
int main()
{
    ll T, n, m, k, a, b, g, num1, num2;
    scanf("%lld", &T);
    while (T--)
    {
        scanf("%lld%lld%lld%lld%lld", &n, &m, &k, &a, &b);
        if(a > n || b > m)
        {
            printf("0 1\n");
            continue;
        }
        if(k < a + b && a + b == n + m)
        {
            printf("0 1\n");
            continue;
        }
        if(a + b < n + m && a + b != k)
        {
            printf("0 1\n");
            continue;
        }
        num1 = C(n, a) * C(m, b);
        num2 = C(m + n, a + b);
        g = gcd(num1, num2);
        num1 /= g;
        num2 /= g;
        printf("%lld %lld\n", num1, num2);
    }
    return 0;
}