您的位置:首页 > 其它

HDU 5194 DZY Loves Balls

2015-03-28 23:37 375 查看
Problem Description

There are n black
balls and m white
balls in the big box.

Now, DZY starts to randomly pick out the balls one by one. It forms a sequence S.
If at the i-th
operation, DZY takes out the black ball, Si=1,
otherwise Si=0.

DZY wants to know the expected times that '01' occurs in S.



Input

The input consists several test cases. (TestCase≤150)

The first line contains two integers, n, m(1≤n,m≤12)



Output

For each case, output the corresponding result, the format is p/q(p and q are
coprime)



Sample Input

1 1
2 3




Sample Output

1/2
6/5

HintCase 1: S='01' or S='10', so the expected times = 1/2 = 1/2
Case 2: S='00011' or S='00101' or S='00110' or S='01001' or S='01010' 
or S='01100' or S='10001' or S='10010' or S='10100' or S='11000',
so the expected times = (1+2+1+2+2+1+1+1+1+0)/10 = 12/10 = 6/5 

考虑期望的可加性。第i(1≤i<n+m)个位置上出现0,第i+1个位置上出现1的概率是mn+m×nn+m−1,那么答案自然就是∑i=1n+m−1mn+m×nn+m−1=nmn+m
如果你不能马上想到上述的简便的方法,也可以选择暴力枚举所有01串,也是可以AC的。最后一步你需要再计算一下gcd,十分简便。
强大的题解,可惜本人是想不到这样的,自己dp玩玩。

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<cstdlib>
using namespace std;
const int maxn = 20;
int n, m, T, f[maxn][maxn][4], tot;

int gcd(int x, int y)
{
    if (x % y != 0) return gcd(y, x%y);
    return y;
}

int main()
{
    while (scanf("%d%d", &n, &m) != EOF)
    {
        memset(f, 0, sizeof(f));
        for (int i = 1; i <= max(n, m); i++) f[0][i][0] = f[i][0][1] = 1;
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                if (i + j)
                {
                    f[i][j][0] = f[i][j - 1][0] + f[i][j - 1][1];
                    f[i][j][2] = f[i][j - 1][2] + f[i][j - 1][3];
                    f[i][j][1] = f[i - 1][j][0] + f[i - 1][j][1];
                    f[i][j][3] = f[i - 1][j][2] + f[i - 1][j][3] + f[i - 1][j][0];
                }
        for (int i = n + 1, j = tot = 1; i <= n + m; i++)
        {
            tot *= i;
            while (j <= m&&tot%j == 0) tot = tot / j++;
        }
        int k = gcd(tot, f
[m][3] + f
[m][2]);
        printf("%d/%d\n", (f
[m][2] + f
[m][3]) / k, tot / k);
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: