数学题(期望+分数计算)-UVA 10288-Coupons

  • 数学题(期望+分数计算)-UVA 10288-Coupons


题目大意是有n种奖,每种奖在一张彩票中获得的几率相同,问要集齐n种奖,需要买的彩票数量的期望,用整数加分式(要求最简分式)表示

期望是线性的,所以采用分治法的思想求整体期望

设Y为集齐n种奖需要买的彩票数量

设 Y_{k} 为已获得 k 种奖后,想收集到第 k+1 种奖需要买的彩票数量

可得 Y=Y_{0}+Y_{1}+Y_{2}+...+Y_{n-1}

由期望的线性:E(Y)=E(Y_{0}+Y_{1}+Y_{2}+...+Y_{n-1})=E(Y_{0})+E(Y_{1})+E(Y_{2})...+E(Y_{n-1})

因为获得k种奖后,再想获得第k+1种奖的概率为 (n-k)/n ,设对立面不能获得第k+1种奖的概率为 p=k/n

能否获得是互相对立的(条件概率),所以要获得第k+1奖所需买的彩票数可能为 1~m(m为无穷大,可能运气差一直开不到

得 收集到第k+1张彩票需要买 t 张彩票的概率为 P_{t}=p^{t-1}*(1-p)

所以  Y_{k} 的期望为:E(Y_{k})=\sum_{n}^{t=1}t*P_{t}=(1-p)(1+2p+3p^{2}+...+mp^{m-1})

利用数列错位相减法求得 E(Y_{k})=\frac{1-p^{m-1}}{1-p}-mp^{m}

因为m为无穷大,取极限后 E(Y_{k})=\frac{1}{1-p}=\frac{1}{1-\frac{k}{n}}=\frac{n}{n-k}

求到最后居然发现  E(Y_{k})=\frac{1}{1-p},也就是获得第k+1种奖的概率的倒数,感觉还是记住公式吧~条件概率的公式

最后对各部分期望求和     E(Y)=\frac{n}{n}+\frac{n}{n-1}+\frac{n}{n-2}+...+\frac{n}{1}=\sum_{i=0}^{n}\frac{1}{n-i} or \sum_{i=1}^{n}\frac{1}{i}

我是用左边的累加式计算,两个累加式都一样啦

 

然后就是分数计算,别看33小,不用long long分分钟WA到自闭,我怕溢出,每进行一次分数相加就检查然后取出整数加约分

  • 代码:

#include <iostream>

using namespace std;

long long gcd(long long a,long long b) //最大公约数
{
    return b==0? a : gcd(b,a%b);
}

long long lcd(long long a,long long b)  //最小公倍数
{
    return (a*b)/gcd(a,b);
}

int main()
{
    int n;
    while(cin>>n)
    {
        int Inter_num=0;
        long long Fenzi,Fenmu;
        long long Res_z=0,Res_m=0;
        for(int i=0;i<n;i++)
        {
            Inter_num+=n/(n-i);   //整数部分直接加上
            Fenzi=n-(n/(n-i))*(n-i);  //分子
            Fenmu=n-i;    //分母
            if(Fenzi!=0)    //有分数部分进行分数相加
            {
                if(Res_z==0)   //初始化
                {
                    Res_m+=Fenmu;
                    Res_z+=Fenzi;
                }
                else
                {
                    long long new_mu;
                    if(Fenmu>Res_m)    //通分求分母
                        new_mu=lcd(Fenmu,Res_m);  
                    else
                        new_mu=lcd(Res_m,Fenmu);
                    Res_z=(new_mu/Res_m)*Res_z+(new_mu/Fenmu)*Fenzi;  //相加后分子
                    Res_m=new_mu;    //新分母
                    if(Res_z>Res_m)    //提取整数部分
                    {
                        Inter_num+=Res_z/Res_m;
                        Res_z-=(Res_z/Res_m)*Res_m;
                    }
                   
                    //进行约分
                    new_mu=gcd(Res_m,Res_z);
                    if(new_mu!=1)
                    {
                        Res_z/=new_mu;
                        Res_m/=new_mu;
                    }
                }
            }
        }
        if(Res_z==0)
            cout<<Inter_num<<endl;  //只有整数直接输出
        else   //打印分数,三行,用空格控制格式
        {
            int bit=0;
            long long Temp=Inter_num;
            while(Temp)
            {
                bit++;
                Temp/=10;
            }
            for(int i=0;i<=bit;i++)
                cout<<" ";
            cout<<Res_z<<endl;
            cout<<Inter_num<<" ";
            Temp=Res_m;
            int bit1=0;
            while(Temp)
            {
                bit1++;
                Temp/=10;
            }
            for(int i=0;i<bit1;i++)
                cout<<"-";
            cout<<endl;
            for(int i=0;i<=bit;i++)
                cout<<" ";
            cout<<Res_m<<endl;
        }

    }
    return 0;
}

 

  • 我想BB:

我想低调说下,我真的是全网求期望最走心的人~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值