UVA 10288 Coupons

#include <iostream>
#include <stdio.h>
#include <cstring>
#define N 34
typedef long long LL;
using namespace std;

struct T{
    LL zs,fz,fm;
    T()
    {
        zs = 0;
        fz = 0;
        fm = 1;
    }
    T(LL a, LL b, LL c)
    {
        zs = a;
        fz = b;
        fm = c;
    }
    void Add(struct T t)
    {
        zs += t.zs;
        fz = fz*t.fm+t.fz*fm;
        fm = fm*t.fm;
        Standard();
    }
    void Standard()
    {
        zs += fz/fm;
        fz = fz%fm;
        LL g=gcd(fz,fm);
        fz = fz/g;
        fm = fm/g;
    }
    LL gcd(LL a, LL b)
    {
        return b==0?a:gcd(b,a%b);
    }
};

struct T ans[N];

void Init()
{
    for(int i=1;i<N;i++)
    {
        for(int j=1;j<=i;j++)
        {
            ans[i].Add(T(0,i,j));
        }
    }
}

int Len(LL a)
{
    int len=0;
    while(a)
    {
        len++;
        a /= 10;
    }
    return len;
}

void Print(struct T t)
{
    int i;
    if(t.fz==0)
        printf("%lld\n", t.zs);
    else
    {
        for(i=0;i<Len(t.zs)+1;i++)
            printf(" ");
        printf("%lld\n", t.fz);
        printf("%lld ", t.zs);
        for(i=0;i<Len(t.fm);i++)
            printf("-");
        printf("\n");
        for(i=0;i<Len(t.zs)+1;i++)
            printf(" ");
        printf("%lld\n", t.fm);
    }
}

int main()
{
    int n;
    Init();
    while(scanf("%d",&n)!=EOF)
    {
        Print(ans[n]);
    }
    return 0;
}
时间: 2024-10-13 21:28:52

UVA 10288 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 10288 - Coupons(概率)

题目链接:uva 10288 - Coupons 题目大意:给定n,为有n中兑换卷,现在每开一次箱子,就能等概率的获得其中的一种兑换卷.问说平均情况下需要开多少个箱子才能集齐n种兑换卷. 解题思路:dp[i]表示还有i种没获得,dp[i]=n?in?dp[i]+in?dp[i?1]+1 ===>dp[i]=dp[i?1]+ni #include <cstdio> #include <cstring> #include <algorithm> using names

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 10288 Coupons (概率)

题意:有n种纸片无限张,随机抽取,问平均情况下抽多少张可以保证抽中所有类型的纸片 题解:假设自己手上有k张,抽中已经抽过的概率为 s=k/n:那抽中下一张没被抽过的纸片概率为 (再抽一张中,两张中,三张中...)(1-s)*(1+2*s+3*s^3+...)=(1-s)*E   s*E = (s+2*s^2+3*s^3+...):则E-s*E = (1+s+s^2+s^3+...)(等比数列,且公比不可能为1)=1/(1-s) = n/(n-k)  所以总概率就是n*(1/n+1/(n-1)+.

10288 - Coupons(赠券收集问题)(概率)

roblem 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 coupon per box,

UVa 10288 (期望) Coupons

题意: 每张彩票上印有一张图案,要集齐n个不同的图案才能获奖.输入n,求要获奖购买彩票张数的期望(假设获得每个图案的概率相同). 分析: 假设现在已经有k种图案,令s = k/n,得到一个新图案需要t次的概率为:st-1(1-s): 因此,得到一个新图案的期望为(1-s)(1 + 2s + 3s2 + 4s3 +...) 下面求上式中的级数: 令 则 所以得到一个新图案的期望为: 总的期望为: 这道题的输出很新颖,如果是分数的话,就要以分数形式输出,具体细节详见代码. 1 #include <i

uva 10288 gailv

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 coupon per box

UVa 10288 Coupous (条件概率)

题目 题目大意 大街上到处在卖彩票, 一元钱一张.购买撕开它上面的锡箔, 你会看到一个漂亮的图案.图案有\(n\)种, 如果你收集到所有\(n\)(\(n ≤ 33\))种彩票, 就可以得到大奖.请问, 在平均情况下, 需要买多少张彩票才能得到大奖呢? 如\(n = 5\)时的答案为\(11\frac{5}{12}\). 题解 设已经有\(k\)个图案: 平均拿\(\frac{n}{n - k}\)次就可多搜集一个, 所以总次数为: \[n\sum_{i = 0}^{n - 1}\frac{1}

数学第二课

几个符号的认识: 或      |   ,   c=a|b,二进制下c的第i位为1,当且当a和b的第i位不同时为0,即至少有一个1. 异或  ^   ,   c=a^b,二进制下c的第i位为1,当且当a和b的第i位不相同. 且     &   ,   c=a|b,二进制下c的第i位为1,当且当a和b的第i位同时为1. 性质: ‘或’具有扩散性,即一个数列,‘或’的个数越多,结果越大. ‘且’具有收敛性,个数越多,结果越小. 例题: Interview ,CodeForces - 631A 题意: