HDU 5810 Balls and Boxes (打表)

来源:互联网 发布:不可思议的植物 知乎 编辑:程序博客网 时间:2024/05/17 02:08

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
V=mi=1(XiX¯)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.
 

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 12 20 0
 

Sample Output
0/11/2
Hint
In the second sample, there are four possible outcomes, two outcomes with V = 0 and two outcomes with V = 1.
 

Author
SYSU
 

Source
2016 Multi-University Training Contest 7

题意:n个球 放进m个箱子,每个球放进每个箱子的概率相同。求题意中的V=mi=1(XiX¯)2m

point:
打表找到规律。

打表代码:
#include <stdio.h>#include<iostream>using namespace std;#define  ll long longint 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 longll 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);            }    }





原创粉丝点击