Link:http://acm.hdu.edu.cn/showproblem.php?pid=5194
DZY Loves Balls
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 500 Accepted Submission(s): 276
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 .
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)
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/5HintCase 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
Source
解题思想:
考虑期望的可加性。第 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,十分简便。
AC code:
#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<set>
#include<cstdlib>
#include<string.h>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
using namespace std;
int gcd(int a,int b)
{
if(a<b)
{
int t=a;
a=b;
b=t;
}
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int a=n*m;
int b=n+m;
int t=gcd(a,b);
a/=t;
b/=t;
printf("%d/%d\n",a,b);
}
return 0;
}