hdu 1099(期望入门)

——转自 http://hi.baidu.com/zf2650/item/c0c74480d82e435b27ebd9fd

1.题意解释:意思是有n种彩票,你要想集齐这所有的n种,需要买多少张彩票(就像我们小时候吃小当家集108个水浒英雄的卡片一样,要买多少袋?当然我们吃小当家的时候108种卡片可不是均匀出现的,呵呵,跑题了).
2.如果有n种,那么我们要求的结果就是n/n + n/n-1 + n/n-2 +...+ n/2 + n/1 ,即n*(1/n + 1/n-1 +...+ 1/2 +1/1)
     原理: 我们要集齐n种不同的彩票,
     买第一张任意,概率为n/n,买第二张就需要和第一张不同,即剩下的n-1种里哪种都可以,成功的概率是n-1/n...如果我们已经集齐了n-1种,再买彩票我们希望买到最后一种,由于是均匀分布的,所以买到最后一种彩票的概率是1/n.那么从期望的角度来说我们需要买n张,才能买到(当然我们就算买n张也不一定就能买到,也可能买1张就买到了最后一种,完全是从数学角度!!! 概率角度!!!),同理,当我们拥有一半种类的彩票时,再买一张彩票不重复的概率是(n/2)/n,即1/2,也就说买2张,就会再得到一种不重复的

   所以一种彩票也没有时,只需买1张,即n/n,如果已经有了5张,那么买n/(n-5)张就可以再买到一张不重复的,如果我们已经集了n-1种,我们需要再买n张,才能期望得到最后一种彩票,所以需要买的彩票总数为n/n + n/n-1 + n/n-2 +...+ n/2 + n/1;

3.代码细节: 明白了题意,就是在求n*(1/n + 1/n-1 +...+ 1/2 +1/1),由于题目要求的表达方式比较特殊,整个解题过程基本都是在处理分数的通分了,如果让用小数表示那这个题就几行代码就结束了.由于分子会溢出int的范围,用到了_int64.

 

现在说说我的理解: 关键就是知道如果一件事件发生的概率为x/y  .  那么要发生该事件需要进行 y/x 次,就像中彩票个概率为1/10000, 那么你想要中奖理应买10000次彩票. 理解了这个这题就好做了.

#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;

typedef unsigned long long ll;

ll gcd(ll a,ll b)
{
    ll tmp;
    while(a%b!=0)
    {
        tmp=b;
        b=a%b;
        a=tmp;
    }
    return b;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        ll u=n,d=n;
        for(int i=1;i<n;i++)
        {
            u=u*(n-i)+d*n;
            d=d*(n-i);
            ll tmp=gcd(u,d);
            u/=tmp;
            d/=tmp;
        }
        ll x,y;
        x=u/d;
        y=u%d;
        if(y==0)
            printf("%I64d\n",x);
        else
        {
            int len=0,len1=0;
            ll tmp=x;
            while(tmp>0)
            {
                len++;
                tmp/=10;
            }
            tmp=d;
            while(tmp>0)
            {
                len1++;
                tmp/=10;
            }
            for(int i=0;i<=len;i++)
                printf(" ");
            printf("%I64d\n",y);
            printf("%I64d ",x);
            for(int i=0;i<len1;i++)
                printf("-");
            printf("\n");
            for(int i=0;i<=len;i++)
                printf(" ");
            printf("%I64d\n",d);
        }
    }
    return 0;
}

 

posted @ 2013-02-12 23:26  chenhuan001  阅读(359)  评论(0)    收藏  举报