UVA10288 优惠券 Coupons

UVA10288 优惠券 Coupons 题解。

题意

简化题意如下:

每次随机取一个 [1,n]\left [ 1,n \right ] 的整数,问期望几次能够凑齐所有数。

思路

我们设 f_if\_{i} 为取出第 ii 个数期望需要的次数,p_ip\_{i} 为取出第 ii 个数的概率。

已经取出 i1i-1 个数,所以 p_ip\_{i} 就是 ni+1n\frac{n-i+1}{n}

我们有个结论:概率为 pp 的事件期望 1p\frac{1}{p} 次后发生。

证明:

E(X)E\left( X \right) 为发生概率为 P(X)P\left( X \right) 的事件 XX 发生期望需要的次数。

那么我们有:

E(X)=sum_i=1i(1P)i1PE\left(X\right)=\\sum\_{i=1}^{\infty } i\left(1-P\right)^{i-1}P

E(X)=Psum_i=1i(1P)i1E\left(X\right)=P\\sum\_{i=1}^{\infty } i\left(1-P\right)^{i-1}

令:

S=sum_i=1i(1P)i1S= \\sum\_{i=1}^{\infty}i\left(1-P\right)^{i-1}

S=1+2(1P)+3(1P)2+...\therefore S=1+2\left(1-P\right)+3\left(1-P\right)^{2}+...

(1P)S=(1P)+2(1P)2+...\left(1-P\right)S=\left(1-P\right)+2\left(1-P\right)^{2}+...

S(1P)S=1+(1P)+(1P)2+...S-\left(1-P\right)S=1+\left(1-P\right)+\left(1-P\right)^{2}+...

P×S=11(1P)=1PP \times S=\frac{1}{1-\left(1-P\right)}=\frac{1}{P}

S=1P2S=\frac{1}{P^{2}}

E(X)=P×S=P×1P2=1P\therefore E\left(X\right)=P\times S=P\times \frac{1}{P^{2}}=\frac{1}{P}

所以,我们能得到 f_i=nni+1f\_{i}=\frac{n}{n-i+1}

所以取出所有数期望次数 F=_i=1nf_i=_i=1nnni+1=_i=1nniF={\textstyle \sum\_{i=1}^{n}f\_{i}}={\textstyle \sum\_{i=1}^{n}\frac{n}{n-i+1}}={\textstyle \sum\_{i=1}^{n}\frac{n}{i}}

根据这个式子计算答案就好了。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<bits/stdc++.h>
#define int long long
int n;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
signed main() {
ios::sync_with_stdio(false);
while (cin >> n) {
int son = n, mother = 1;
for (int i = 2; i <= n; i++) {
son = son * i + n * mother;
mother *= i;
int g = gcd(son, mother);
son /= g;
mother /= g;
}
//输出部分
if (son % mother == 0) {
printf("%lld\n", son / mother);
continue;
} else {
int c = log10(son / mother) + 1;
int c2 = log10(mother) + 1;
for (int i = 1; i <= c + 1; i++)printf(" ");
printf("%lld\n", son % mother);
printf("%lld ", son / mother);
for (int i = 1; i <= c2; i++)printf("-");
puts("");
for (int i = 1; i <= c + 1; i++)printf(" ");
printf("%lld\n", mother);
}
}
return 0;
}