HDU 1099 [Lottery] 数学期望

Posted 哇咔咔咔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1099 [Lottery] 数学期望相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1099

题目大意:一套卡片有n张,每次购买随机获得一张卡片,问集齐一套卡片的期望次数是多少?

关键思想:知道此处期望是概率的倒数即可,比如有5张卡片,

第一步你获得想要卡片的概率是1,倒数为1;

第二步你获得想要卡片的概率是4/5,倒数为5/4;

第三步你获得想要卡片的概率是3/5,倒数为5/3;

……累加即为结果,格式输出有些坑爹,耐心就好。

代码如下:

#include <iostream>
using namespace std;

typedef long long ll;

ll GCD(ll a,ll b){
    if(a==0||b==0)return 1; 
    return a%b==0?b:GCD(b,a%b);
}

int digits(ll n){
    int d=0;
    while(n){
        n/=10;
        d++;
    }
    return d;
}

int main(){
    int n;
    ll num,deno,inte;//分子分母整数部分 
    while(scanf("%d",&n)!=EOF){
        num=0,deno=1,inte=1;
        for(int i=1;i<=n-1;i++){ 
            num=num*i+deno*n;
            deno=deno*i;
            
            ll gcd=GCD(num,deno);//约分 
            num/=gcd;
            deno/=gcd; 
        } 
        inte+=num/deno;//整数部分 
        num=num%deno;//分数部分 
        if(num==0)printf("%lld\n",inte);//若能整除 
        else{//格式化输出 
            for(int i=0;i<=digits(inte);i++)printf(" "); 
            printf("%lld\n",num);
            printf("%lld ",inte);
            for(int i=0;i<digits(deno);i++)printf("-");
            printf("\n");
            for(int i=0;i<=digits(inte);i++)printf(" ");
            printf("%lld\n",deno);
        }

    }
    return 0;
}

 

以上是关于HDU 1099 [Lottery] 数学期望的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 1099 - Lottery - 概率dp

HDU1099---数学 | 思维

HDU 1099 Lottery

hdu 1099(数学)

HDU 5984 数学期望

HDU4336Card Collector (动态规划,数学期望)