UVa 10288 (期望) Coupons

题意:

每张彩票上印有一张图案,要集齐n个不同的图案才能获奖。输入n,求要获奖购买彩票张数的期望(假设获得每个图案的概率相同)。

分析:

假设现在已经有k种图案,令s = k/n,得到一个新图案需要t次的概率为:st-1(1-s);

因此,得到一个新图案的期望为(1-s)(1 + 2s + 3s2 + 4s3 +...)

下面求上式中的级数:

所以得到一个新图案的期望为:

总的期望为:

这道题的输出很新颖,如果是分数的话,就要以分数形式输出,具体细节详见代码。

 1 #include <iostream>
 2 #include <sstream>
 3 #include <cstdio>
 4 using namespace std;
 5 typedef long long LL;
 6
 7 LL gcd(LL a, LL b)
 8 {
 9     if(b == 0) return a;
10     return gcd(b, a % b);
11 }
12
13 LL lcm(LL a, LL b)
14 {
15     return a / gcd(a, b) * b;
16 }
17
18 int LL_length(LL x)
19 {
20     stringstream ss;
21     ss << x;
22     return ss.str().length();
23 }
24
25 void print_chars(char c, int n)
26 {
27     for(int i = 0; i < n; ++i)
28         putchar(c);
29 }
30
31 void output(LL a, LL b, LL c)
32 {
33     if(b == 0)
34     {
35         printf("%lld\n", a);
36         return;
37     }
38     int l = LL_length(a);
39     print_chars(‘ ‘, l+1);
40     printf("%lld\n", b);
41     printf("%lld ", a);
42     print_chars(‘-‘, LL_length(c));
43     printf("\n");
44     print_chars(‘ ‘, l+1);
45     printf("%lld\n", c);
46 }
47
48 int main()
49 {
50     int n;
51     while(scanf("%d", &n) == 1)
52     {
53         if(n == 1)
54         {
55             puts("1");
56             continue;
57         }
58         LL x = 1, a = n + 1, b = 0, c;
59         for(int i = 2; i <= n-1; ++i)
60             x = lcm(x, i);
61         c = x;
62         x *= n;
63         for(int i = 2; i <= n-1; ++i)
64             b += x / i;
65         a += b / c;
66         LL g = gcd(b, c);
67         b /= g, c /= g;
68         b %= c;
69         output(a, b, c);
70     }
71
72     return 0;
73 }

代码君

时间: 2024-10-07 11:01:13

UVa 10288 (期望) Coupons的相关文章

UVA 10288 - Coupons(概率递推)

UVA 10288 - Coupons 题目链接 题意:n个张票,每张票取到概率等价,问连续取一定次数后,拥有所有的票的期望 思路:递推,f[i]表示还差i张票的时候期望,那么递推式为 f(i)=f(i)?(n?i)/n+f(i?1)?i/n+1 化简后递推即可,输出要输出分数比较麻烦 代码: #include <cstdio> #include <cstring> #include <cmath> long long gcd(long long a, long lon

uva 10288 - Coupons(概率)

题目链接:uva 10288 - Coupons 题目大意:给定n,为有n中兑换卷,现在每开一次箱子,就能等概率的获得其中的一种兑换卷.问说平均情况下需要开多少个箱子才能集齐n种兑换卷. 解题思路:dp[i]表示还有i种没获得,dp[i]=n?in?dp[i]+in?dp[i?1]+1 ===>dp[i]=dp[i?1]+ni #include <cstdio> #include <cstring> #include <algorithm> using names

UVA - 10288 Coupons (概率+递推)

Description Problem F Coupons Input: standard input Output: standard output Time Limit: 2 seconds Memory Limit: 32 MB Coupons in cereal boxes are numbered 1 to n, and a set of one of each is required for a prize (a cereal box, of course). With one co

UVA 10288 Coupons

#include <iostream> #include <stdio.h> #include <cstring> #define N 34 typedef long long LL; using namespace std; struct T{ LL zs,fz,fm; T() { zs = 0; fz = 0; fm = 1; } T(LL a, LL b, LL c) { zs = a; fz = b; fm = c; } void Add(struct T t)

UVA 10288 Coupons (概率)

题意:有n种纸片无限张,随机抽取,问平均情况下抽多少张可以保证抽中所有类型的纸片 题解:假设自己手上有k张,抽中已经抽过的概率为 s=k/n:那抽中下一张没被抽过的纸片概率为 (再抽一张中,两张中,三张中...)(1-s)*(1+2*s+3*s^3+...)=(1-s)*E   s*E = (s+2*s^2+3*s^3+...):则E-s*E = (1+s+s^2+s^3+...)(等比数列,且公比不可能为1)=1/(1-s) = n/(n-k)  所以总概率就是n*(1/n+1/(n-1)+.

uva 10288 gailv

Problem F Coupons Input: standard input Output: standard output Time Limit: 2 seconds Memory Limit: 32 MB Coupons in cereal boxes are numbered 1 to n, and a set of one of each is required for a prize (a cereal box, of course). With one coupon per box

UVa 12230 (期望) Crossing Rivers

题意: 从A到B两地相距D,之间有n段河,每段河有一条小船,船的位置以及方向随机分布,速度大小不变.每段河之间是陆地,而且在陆地上行走的速度为1.求从A到B的时间期望. 分析: 我们只要分析每段河的期望即可.设河的长度为L,船速为v.过河最短时间为刚好搭上从左向右开的小船L/v:最长时间为刚好没搭上从左向右开的小船,所以要等小船开到对岸再折返回来再到对岸,时间为3L/v,因为是均匀分布,所以期望为2L/v,最后再加上陆地上行走的时间就是答案. 1 #include <cstdio> 2 3 i

UVa 11427 (期望 DP) Expect the Expected

设d(i, j)表示前i局每局获胜的比例均不超过p,且前i局共获胜j局的概率. d(i, j) = d(i-1, j) * (1-p) + d(i-1, j-1) * p 则只玩一天就就不再玩的概率Q = sum{d(n, i) | 0 ≤ i ≤ p*n} 那么期望为 这是一个无穷级数,可以用高数的一些知识来解决. 另1-Q = t 将1-Q带入t,并将左边的Q乘过去得: 书上还介绍了一种更简单的方法,假设所求期望为e 第一天玩完就去睡觉,概率为Q,期望为1:第一天玩得高高兴兴,概率为1-Q,

UVa 1639 (期望) Candy

题意: 两个盒子里各有n颗糖,每天有p的概率从第一个盒子里取一颗糖,1-p的概率从第二个盒子里去一颗糖.直到某一天打开某个盒子忽然发现没糖了,求另一个盒子里剩余糖果数的期望. 分析: 紫书上面已经分析的很清楚了,而且也给出了解决精度损失问题的方法,就是先取对数然后再乘幂. 1 #include <cstdio> 2 #include <cmath> 3 4 const int maxn = 200000 + 5; 5 long double logF[maxn * 2 + 1];