【SHOI 2002】百事世界杯之旅 (BSOI4841)

15 篇文章 2 订阅


【SHOI 2002】百事世界杯之旅

Description

……在2003年6月之前购买的百事任何饮料的瓶盖上都会有一个百事球星的名字。只要凑齐所有百事球星的名字,就可以参加百事世界杯之旅的抽奖活动,获取球星背包、随身听,更可以赴日韩观看世界杯。还不赶快行动!……”
你关上电视,心想:假设有n个不同球星的名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢?

Input

输入一个数字n,2≤n≤33,表示不同球星名字的个数。                                                      

Output

输出凑齐所有的名字平均需要购买的饮料瓶数。如果是一个整数则直接输出。否则就用下面样例中的格式分别输出整数部分和小数部分。分数必须是不可约的。

Sample Input

5

Sample Output

11(5/12)

Hint

输出说明:先输出整数部分,若有小数部分,用括号把不可约分式括起来
思路:

分析 这是一道比较简单的概率和期望问题。只要确定好计算方法,就可以很容易的得到公式。如果单独考虑每一名球星,那么就中了命题人的圈套。因为考虑单独的一个球星的时候所买的“没用”的饮料在考虑其他球星的时候可能会变成有用的。正确的思路是,假设现在已经有k个球星的名字,那么要使球星的名字达到k+1个平均需要买多少瓶饮料?这是很容易计算的。 我们可以知道,第一个球星抽到的概率是1,第n个是1/n。那么我们要从k个到k+1个球星的概率为(n-k)/n,所以期望为n/(n-k)。所以我们从没有球星的名字开始,直到把所有的球星名字都凑齐,平均需要的饮料数(E)就可以计算出来:

ANS=n(1/1+1/2+1/3+....1/n)

由于题目的数据规模并不大,所以可以直接使用PASCAL的Comp或Int64(C/C++的long long)进行计算。而题目要求得到即约分数,只要在计算的时候使用分数并注意约分就可以了。


如果n很大,就要用公式 :   0.57721566490153286060651209 + ln(n)


(参与分数计算的都要开long long,整型一定会爆。。。)


#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b)
{
    return b == 0 ? a : gcd(b, a%b);
}
int main()
{
    int n;
    while(~scanf("%d", &n))
    {
        ll a = 1, b = 1, temp;
        for(int i = 2; i <= n; i++)  //这里计算调和级数。。。
        {
            a = a*i + b;  //模拟通分过程
            b = b*i;
            temp = gcd(a, b);
            a /= temp;  //不断同分的过程 不断化简
            b /= temp;
        }
        a = a*n;
        if(a%b == 0)
        {
            printf("%lld\n", a/b);
        }
        else
        {
            printf("%lld", a/b);
            a = a%b;
            printf("(%lld/%lld)\n", a/gcd(a, b), b/gcd(a,b));  //输出真分数
        }
    }
    return 0;
}






  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值