HDU - 5810
有 n 个球,
m 个盒子,随机将球放入盒子中
求每个盒子球个数的方差的期望值
方差 V=∑i=1mXi−X¯2m
推推公式啥的,赛上没推出来,最后找规律过得
果然期望和概率还是太差了啊 orz
首先可以展开公式,
V=∑i=1mXim−2X¯nm+X¯2=∑i=1mXim−n2m2
然后就变成求前面那项的期望了,
用一个随机变量
Yj
来表示第
j
个球是否在第
E(Xi)=E((∑j=1nYj)2)
利用期望的线性性展开这个和式得到
E((∑j−1nYj)2)=E(∑j=1nY2j)+E(∑j=1n∑k=1,k≠jnYjYk)=nE(Y2j)+n(n−1)E(YjYk)=nm+n(n−1)m2
所以最后的答案就是
E(V)=nm+n(n−1)m2−n2m2=n(m−1)m2
#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <map>
#include <set>
#include <queue>
#include <bitset>
#include <string>
using namespace std;
typedef pair<int,int> Pii;
typedef long long LL;
typedef unsigned long long ULL;
typedef double DBL;
typedef long double LDBL;
#define MST(a,b) memset(a,b,sizeof(a))
#define CLR(a) MST(a,0)
#define SQR(a) ((a)*(a))
#define PCUT puts("\n----------")
LL GCD(LL a, LL b){return b?GCD(b, a%b):a;}
LL N,M;
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
#endif
while(~scanf("%lld%lld", &N, &M))
{
if(!N && !M) break;
LL D = GCD(N*(M-1), M*M);
printf("%lld/%lld\n", N*(M-1)/D, M*M/D);
}
return 0;
}