HDU—— 1099 Lottery

来源:互联网 发布:网络教育考试哪里考 编辑:程序博客网 时间:2024/05/21 18:37

题意:Eddy的公司出了一种彩票,该彩票为一个系列,每个系列有N张且编号为1~N,当收集齐所有彩票后就能得到一种奖品,问平均需要买多少张才能集齐每个系列的N张彩票?ps:读题读的蛋疼,理解起来也很费劲。

解题思路:首先不管你买多少张,肯定能买中N张中的任意一张概率为N/N,接着能买中剩下N-1张当中的任意一张的概率为N-1/N,依次类推N-2/N、N-3/N......1/N,对每次的概率求倒数就是每买中一张彩票需要的平均彩票数,然后将所有倒数相加得:N(1+1/2+1/3+......+1/N-1+1/N),然后就是对该式子进行求解,详见代码。

Code:

#include <iostream>#include <cstdio>using namespace std;typedef long long LL;LL FenMu[25],FenZi[25];LL gcd(LL x,LL y){    return y==0 ? x:gcd(y,x%y);}int main(){    //freopen("input.txt","r",stdin);    FenMu[1] = 1,FenZi[1] = 1;    for(LL j = 2; j <= 22; j++)//采用递推思想,第i位的分母值是数值i与i-1位置的分母值的最小公倍数    {        FenMu[j] = j*FenMu[j-1]/gcd(j,FenMu[j-1]);//两个数的最小公倍数等于两个数的乘积除以两个数的最大公约数        FenZi[j] = FenMu[j]/j+FenMu[j]/FenMu[j-1]*FenZi[j-1];//i位置的分子值FenZi[i]等于本位分子值FenMu[i]/i    }//加上前一位分子值FenMu[i]/FenMu[i-1]*FenZi[i-1]    LL N;    while(~scanf("%I64d",&N))    {        int len1 = 0,len2 = 0,len3 = 0;        if(N*FenZi[N]%FenMu[N] == 0) printf("%I64d\n",N*FenZi[N]/FenMu[N]);        else        {           LL inter = N*FenZi[N]/FenMu[N];           LL FZ = N*FenZi[N]%FenMu[N], FM = FenMu[N];           LL factor = gcd(FZ,FM);//分数部分要化简           FZ /=factor, FM /=factor;//化简           LL n1 = inter, n2 = FM;           while(n1) {len1++; n1 /=10;}           while(n2) {len2++; n2 /=10;}           for(int i = 0; i <= len1; i++) printf(" ");//输出格式处理           printf("%I64d\n",FZ); printf("%I64d ",inter);//整数部分与分数部分要有一个空格           for(int j = 0; j < len2; j++) printf("-"); printf("\n");           for(int k = 0; k <= len1; k++) printf(" "); printf("%I64d\n",FM);        }    }    return 0;}

0 0