uva 10288 coupons

原创 2013年12月05日 23:28:16

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, how many boxes on average are required to make a complete set of n coupons?

Input

Input consists of a sequence of lines each containing a single positive integer n, 1<=n<=33, giving the size of the set of coupons. Input is terminated by end of file.

Output

For each input line, output the average number of boxes required to collect the complete set of n coupons. If the answer is an integer number, output the number. If the answer is not integer, then output the integer part of the answer followed by a space and then by the proper fraction in the format shown below. The fractional part should be irreducible. There should be no trailing spaces in any line of output.

Sample Input

2
5
17

Sample Output

3 
   5
11 --
   12
   340463
58 ------
   720720

题目大意:一共有n中不同的优惠券 ,每次得到每种优惠券的概率相同。问期望多少次可以得到所有n种优惠券。 a <= n <= 33

(吐槽一下原题目 ,英文的也很短 ,妈蛋看了半个小时没读懂,好歹也是过了六级的人,果然智商有限)


其实感觉这道题是下面这样的一道题的推广

抛一枚均匀的硬币直到出现k次正面为止,试求抛掷次数X的数学期望。

解:
令Xi表示出现i-1次正面后,到出现第i次正面的抛掷次数,则
X = X1 + X2 + ... + Xk

Xi服从几何分布,由期望公示E(X+Y) = E(X) + E(Y) 就可以得到结果

思维上的难度应当就是分解
将n次抛掷的过程仔细考察,由k次正面将n次抛掷分成k段 每一段的长度即为Xi
验证这样分解是正确大概是 这n抛掷k次正面 符合这种情况的单个样本发生的概率 为 p^k * (1 - p) ^ (n - k) 
对于X=n 中的任何一个样本 Xi的和需要每个Xi同时成立满足 概率为Xi单个的乘积 也为  p^k * (1 - p) ^ (n - k) 
然后考察 样本总数
每一个n抛掷k次正面的样本点 都可由Xi的唯一一个样本点表示,反过来也是这样
所以应当是一一对应 所以 X 与 Xi 的和 的分布律是相同的
(以上分析很有可能是不对的, 欢迎修正)

将这两个题目联系起来
令Xi 表示出现i 种不同的优惠券后, 到出现第i次不同的优惠券的次数
就和上一道题目一样了

算法分析:假设当前已经有k种优惠券,那么获得新优惠券的概率是(n-k).n,所以需要部署的期望是n/(n-k).。求和得到不熟的期望是n/n + n/(n-1) +... +n/1 = n * sigma(1/i)

AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <cassert>

using namespace std;

typedef long long LL;

LL n, r;
LL p, q;

LL gcd(LL a, LL b){
	if(b == 0){
		return a;
	}
	return gcd(b, a % b);
}
void reduction(LL &a, LL &b){
	LL d = gcd(a, b);
	a /= d;
	b /= d;
}
void addF(int a, int b){
	p = p * b + a * q;
	//cout << p << " " ;
	q *= b;
	reduction(p, q);
}
void printF(LL p){
	LL rr = r;
	while(rr){
		printf(" ");
		rr /= 10;
	}
	printf(" ");
	printf("%lld\n", p);
}
int main(){
#ifdef DEBUG
	FILE *fPtr = freopen("a.in", "r", stdin);
	assert(fPtr != NULL);
	fPtr = freopen("a.out", "w", stdout);
	assert(fPtr != NULL);
#endif
	while(scanf("%lld", &n) == 1){
		p = 0LL, q = 1LL;
		r = n;
		for(LL i = 1; i <= n; i++){
			addF(1, i);
		}
		//cout << p << "  " << q << endl;
		reduction(r, q);
		p *= r;
		//cout << "p = " << r << endl;
		r = p / q;
		p %= q;
		if(p % q == 0){
			printf("%lld\n", r);
		}
		else{
			printF(p);
			printf("%lld ", r);
			LL qq = q;
			while(qq){
				printf("-");
				qq /= 10;
			}
			printf("\n");
			printF(q);
		}
	}
	return 0;
}



(不得不说uva一直很受伤人 有时候多一个空格都是wa  而不是pe
代码很丑 很简单的代码改了n遍才能正确表达意思 也是很久没写代码的缘故了 伤心)

题目大意 算法分析 来自《题目与解读》

Uva 10288 - Coupons

自己写的正数分数类,也作为红书第一题,留念。。。 alpc 加油。 #include #include #include #include #include #include using...
  • utoppia
  • utoppia
  • 2013年04月15日 00:26
  • 574

UVa10288 - Coupons(避免高精度的优美姿势)

题目链接简介: 买彩票分析: 假设我们现在手里已经有了k图案,令s=k/n,拿一个新的图案需要t次的概率:s^(t-1)*(1-s)也就是说,平均拿n/(n-k)次就可以多收集一个图案 所以答案...

UVA10288 Coupons(卡输出神题)

给出n,求Σn/i (i = 1 to n,n 分数的基本运算,首先打好表。 #include using namespace std; typedef long long LL; struct ...
  • cqbzwja
  • cqbzwja
  • 2015年08月17日 20:10
  • 329

Uva 10288 Coupons (概率dp)

大题题意: 一共有n 种不同的优惠券,每次得到每种优惠券的概率相同。问期望多少次可以得到所有n 种的优惠券,以带分数的形式输出! 思路: 这个题 用dp思想比较好理解一些! 令dp[i]表示已...

UVa10288 - Coupons 【数学】

Coupons in cereal boxes are numbered 1 to n, and a set of one of each is required for a prize (a cer...

Uva 10288 Coupons

对于n种不同的coupons,每次得到每种coupons的概率相同。为得到所有的coupons的期望 当已经得到了k种coupons时,得到另外一种的概率是  所以每一步的期望是 ...
  • pootree
  • pootree
  • 2016年11月23日 14:35
  • 105

UVa 10288(Coupons) 数学期望(概率+递推) Java

数学:概率题。注意使用大整数。import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStr...

10288 - Coupons(赠券收集问题)(概率)

roblem F Coupons Input: standard input Output: standard output Time Limit: 2 seconds ...

数学期望(优惠券,uva 10288)

要先求出有n种图案,已拥有k种,平均拿几次就能获得一种新图案。累加起来就是答案。 那怎么求平均拿几次就能获得一种新图案呢?我们设拿到一种新图案需要次数t的概率为p,令s=k/n很容易求得p=s^(t...

UVa 10288

UVa 10288 题意:给你n个Conous,每个出现的概率相等,问你每次随机生成一个Conous,需要的次数的期望。 思路:令dp[i]代表还需要产出i个不同的未出现的Conous的期望次数,...
  • li7879
  • li7879
  • 2016年11月22日 19:49
  • 116
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:uva 10288 coupons
举报原因:
原因补充:

(最多只允许输入30个字)