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遍才能正确表达意思 也是很久没写代码的缘故了 伤心)

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【ACM刷题录】UVa10288 Coupons

【题目与出处】 题目:Coupons 出处:UVa 10288 【题意概述】 描述:一共有n种不同的Coupons,每次得到每种Coupons的概率相同。问期望多少次可以得到所有的n种Coup...

Uva 10288 - Coupons

自己写的正数分数类,也作为红书第一题,留念。。。 alpc 加油。 #include #include #include #include #include #include using...

UVA10288 Coupons(卡输出神题)

给出n,求Σn/i (i = 1 to n,n 分数的基本运算,首先打好表。 #include using namespace std; typedef long long LL; struct ...

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) 数学期望(概率+递推) Java

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

Uva 10288 Coupons

对于n种不同的coupons,每次得到每种coupons的概率相同。为得到所有的coupons的期望 当已经得到了k种coupons时,得到另外一种的概率是  所以每一步的期望是 ...

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

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

UVa 10288

UVa 10288 题意:给你n个Conous,每个出现的概率相等,问你每次随机生成一个Conous,需要的次数的期望。 思路:令dp[i]代表还需要产出i个不同的未出现的Conous的期望次数,...

UVa10288优惠券(紫书333)(期望)

时间限制:1秒 内存限制:64M 【问题描述】   大街上到处在卖彩票,一元钱一张。购买撕开它上面的锡箔,你会看到一个漂亮的图案。图案由n种,如果你收集到所有的n中图案的彩票,就可以得大奖。请问,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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