您的位置:首页 > 其它

HDU—— 1099 Lottery

2014-11-02 14:59 323 查看
题意: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
%FenMu
== 0) printf("%I64d\n",N*FenZi
/FenMu
);
else
{
LL inter = N*FenZi
/FenMu
;
LL FZ = N*FenZi
%FenMu
, FM = FenMu
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: