UVA10288 - Coupons (概率+递推)

公式E(x)=n Σ 1/i

因为当已经拿到k张不同的时候 拿到不同牌的期望是 (n-k)/n    ,1除于这个概率就是  n/(n-k) 然后从1到n加

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cassert>

using namespace std;

typedef long long ll;

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

struct Fraction
{
    long long num;
    long long den;
    Fraction(long long num=0,long long den=1)
    {
        if(den<0)
        {
            num=-num;
            den=-den;
        }
        long long g=gcd(abs(num),den);
        this->num=num/g;
        this->den=den/g;
    }
    Fraction operator +(const Fraction &o)const
    {
        return Fraction(num*o.den+den*o.num,den*o.den);
    }
    Fraction operator -(const Fraction &o)const
    {
        return Fraction(num*o.den-den*o.num,den*o.den);
    }
    Fraction operator *(const Fraction &o)const
    {
        return Fraction(num*o.num,den*o.den);
    }
    Fraction operator /(const Fraction &o)const
    {
        return Fraction(num*o.den,den*o.num);
    }
    bool operator <(const Fraction &o)const
    {
        return num*o.den<den*o.num;
    }
    bool operator ==(const Fraction &o)const
    {
        return num*o.den==den*o.num;
    }
};
int n;
int main()
{
    while(cin>>n)
    {
        Fraction ans(n,1);
        Fraction tmp(0,1);
        for(int i=1;i<=n;i++)
            tmp=tmp+Fraction(1,i);
        ans=ans*tmp;
        long long a,b,c;
        a=ans.num;
        b=ans.den;
        if(a/b!=0)
        {
            long long gd=gcd(a,b);
            a/=gd;
            b/=gd;
            c=a/b;
            a=a-c*b;
        }
        else
            c=0;
        if(a==0)
            printf("%lld\n",c);
        else
        {
            int l1,l2,l3;
            long long t1=c,t2=a,t3=b;
            l1=0;
            while(t1)
            {
                t1/=10;
                l1++;
            }
            l2=0;
            while(t2)
            {
                t2/=10;
                l2++;
            }
            l3=0;
            while(t3)
            {
                t3/=10;
                l3++;
            }
            if(l1!=0)
            {
                for(int i=0;i<=l1;i++) printf(" ");
                printf("%lld\n",a);
                printf("%lld ",c);
                int len=max(l2,l3);
                for(int i=0;i<len;i++) printf("-");
                printf("\n");
                for(int i=0;i<=l1;i++) printf(" ");
                printf("%lld\n",b);
            }
            else
            {
                printf("%I64d\n",a);
                int len=max(l2,l3);
                for(int i=0;i<len;i++)
                    printf("-");
                printf("\n");
                printf("%I64d\n",b);

            }
        }
    }
    return 0;
}
时间: 2024-11-05 15:58:07

UVA10288 - Coupons (概率+递推)的相关文章

UVA 10288 - Coupons(概率递推)

UVA 10288 - Coupons 题目链接 题意:n个张票,每张票取到概率等价,问连续取一定次数后,拥有所有的票的期望 思路:递推,f[i]表示还差i张票的时候期望,那么递推式为 f(i)=f(i)?(n?i)/n+f(i?1)?i/n+1 化简后递推即可,输出要输出分数比较麻烦 代码: #include <cstdio> #include <cstring> #include <cmath> long long gcd(long long a, long lon

UVA 11021 - Tribles(概率递推)

UVA 11021 - Tribles 题目链接 题意:k个毛球,每个毛球死后会产生i个毛球的概率为pi,问m天后,所有毛球都死亡的概率 思路:f[i]为一个毛球第i天死亡的概率,那么 f(i)=p0+p1f(i?1)+p2f(i?1)2+...+pnf(i?1)n 然后k个毛球利用乘法定理,答案为f(m)k 代码: #include <stdio.h> #include <string.h> #include <math.h> const int N = 1005;

UVA 1541 - To Bet or Not To Bet(概率递推)

UVA 1541 - To Bet or Not To Bet 题目链接 题意:这题题意真是神了- -,看半天,大概是玩一个游戏,开始在位置0,终点在位置m + 1,每次扔一个硬币,正面走一步,反面走两步,走到的步上有4种情况: 1.向前走n步 2.向后走n步 3.停止一回合 4.无影响 问能在t次机会内,走到终点m + 1(如果跃过也算走到了)的概率,大于0.5,等于0.5,小于0.5对应不同输出 思路:题意懂了就好办了,其实就是递推就可以了dp[i][j]表示第i次机会,落在j步的概率,然后

UVA 11427 - Expect the Expected(概率递推期望)

UVA 11427 - Expect the Expected 题目链接 题意:玩一个游戏,赢的概率p,一个晚上能玩n盘,如果n盘都没赢到总赢的盘数比例大于等于p,以后都不再玩了,如果有到p就结束 思路:递推,dp[i][j]表示玩i盘,赢j盘的概率,那么一个晚上玩了n盘小于p的概率递推式为: dp(i,j)=dp(i?1,j)?(1?p)+dp(i?1,j?1)?p 总和为Q=dp(n,0)+dp(n,1)+...+dp(n,x)(x/n<p) 那么每个晚上失败的概率Q就求出来了,那么平均玩的

UVa 557 (概率 递推) Burger

题意: 有两种汉堡给2n个孩子吃,每个孩子在吃之前要抛硬币决定吃哪一种汉堡.如果只剩一种汉堡,就不用抛硬币了. 求最后两个孩子吃到同一种汉堡的概率. 分析: 可以从反面思考,求最后两个孩子吃到不同汉堡的概率. 因为最后两个汉堡是不同的,所以前面的2n-2个孩子吃汉堡之前一定都是要抛硬币的. 所以,吃两种汉堡的孩子人数相等,都是n-1个. 令,对于2n个孩子吃汉堡,所求概率为1 - f(n-1) 我们还可以递推f, 1 #include <iostream> 2 #include <cst

UVA - 10288 Coupons (概率+递推)

Description 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 co

Uva 11021-Tribles(概率+递推)

题目链接:点击打开链接 题意:k只麻球,每活一天就会死亡,但第二天可能会生一些麻球,具体是 生i个麻球的概率为pi ,求m天后所有麻球都死亡的概率. 思路:考虑全概率公式,求k只麻球m天后全死亡 ,因为死亡是独立事件,应用乘法 ,ans= f[m] ^k ,f[m] 为一只麻球m天后均死亡的概率.对于第i天, f[i]=p0+p1*f[i-1]^1 +p2*f[i-1]^2 +...p(n-1)*f[i-1]^(n-1) (就是让i-1天所有的出生的麻球全部死亡,那么第i天麻球就没了..) 最终

UVa 557 Burger (概率+递推)

题意:有 n 个牛肉堡和 n 个鸡肉堡给 2n 个客人吃,在吃之前抛硬币来决定吃什么,如果剩下的汉堡一样,就不用投了,求最后两个人吃到相同的概率. 析:由于正面考虑还要要不要投硬币,太麻烦,所以我们先求最后两人吃到不同的概率即可,再用 1 减去就OK. 假设最后两个人吃的不一样,那么前 n-2 个人吃的肯定是 n/2 -1个牛肉堡和n/2-1 个鸡肉堡,根据排列组合可知,概率应该是C(n-2, n/2-1) * (0.5)^(n-2). 这就是公式,然而这个并不好算,很可能超时,所以我们再把第

UVa 11021 (概率 递推) Tribles

Tribble是麻球? 因为事件都是互相独立的,所以只考虑一只麻球. 设f(i)表示一只麻球i天后它以及后代全部死亡的概率,根据全概率公式: f(i) = P0 + P1 * f(i-1) + P2 * f(i-1)2 + ... + Pn * f(n)n 每个麻球死亡是独立的,所以Pj * f(i-1)j 表示生了j个麻球,这j个麻球要在i-1天内全部死亡. 1 #include <cstdio> 2 #include <cmath> 3 using namespace std;