Balls and Boxes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 797 Accepted Submission(s): 526
Problem Description
Mr. Chopsticks is interested in random phenomena, and he conducts an experiment to study randomness. In the experiment, he throws n balls into m boxes in such a manner that each ball has equal probability of going to each boxes. After the experiment, he calculated the statistical variance V as
where Xi is the number of balls in the ith box, and X¯ is the average number of balls in a box.
Your task is to find out the expected value of V.
V=∑mi=1(Xi−X¯)2m
where Xi is the number of balls in the ith box, and X¯ is the average number of balls in a box.
Your task is to find out the expected value of V.
Input
The input contains multiple test cases. Each case contains two integers n and m (1 <= n, m <= 1000 000 000) in a line.
The input is terminated by n = m = 0.
The input is terminated by n = m = 0.
Output
For each case, output the result as A/B in a line, where A/B should be an irreducible fraction. Let B=1 if the result is an integer.
Sample Input
2 1 2 2 0 0
Sample Output
0/1 1/2HintIn the second sample, there are four possible outcomes, two outcomes with V = 0 and two outcomes with V = 1.
Author
SYSU
Source
题意:n个球 放进m个箱子,每个球放进每个箱子的概率相同。求题意中的
V=∑mi=1(Xi−X¯)2m
point:
打表找到规律。
打表代码:
#include <stdio.h>
#include<iostream>
using namespace std;
#define ll long long
int x,y;
int a[20];
double v=0;
void dfs(int now,double p) //x球 y箱子
{
if(now==x+1)
{
double ave=0;
double vv=0;
for(int i=1;i<=y;i++)
{
ave+=a[i];
}
ave=ave*1.0/y*1.0;
for(int i=1;i<=y;i++)
{
vv+=(a[i]*1.0-ave)*(a[i]*1.0-ave)/y;
}
v+=vv*p;
return;
}
for(int i=1;i<=y;i++)
{
a[i]++;
dfs(now+1,p/y);
a[i]--;
}
}
ll gcd(ll a,ll b)
{
if(a<b) swap(a, b);
return b?gcd(b,a%b):a;
}
int main()
{
for(int j=1;j<=10;j++)
{
for(int i=1;i<=10;i++)
{
memset(a,0,sizeof a);
v=0;
x=i;
y=j;
dfs(1,1);
printf("%d %d %lf\n",x,y,v);
}
}
}
可得,算出1个球放进m个箱子的v=(m-1)/(m*m)。n个球放进m个箱子就是nv。 分子分母化最简就行。
AC代码:
#include <stdio.h>
#include<iostream>
using namespace std;
#define ll long long
ll gcd(ll a,ll b)
{
if(a<b) swap(a, b);
return b?gcd(b,a%b):a;
}
int main()
{
ll n,m;
while(~scanf("%lld %lld",&n,&m))
{
if(!(n+m)) break;
ll ansa,ansb;
ansa=n*(m-1);
ansb=m*m;
ll d=gcd(ansa,ansb);
printf("%lld/%lld\n",ansa/d,ansb/d);
}
}