码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 1099 Lottery

时间:2015-06-03 21:47:31      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

题意:n种彩票,要想集齐这所有的n种,需要买多少张彩票
分析:n种,要求的结果就是n/n + n/n-1 + n/n-2 +...+ n/2 + n/1 ,即n*(1/n + 1/n-1 +...+ 1/2 +1/1)。要集齐n种不同的彩票,买第一张任意,概率为n/n,买第二张需要和第一张不同,即剩下n-1种里哪种都可以,成功概率是n-1/n。。。如果已经集齐了n-1种,由于是均匀分布的,所以买到最后一种彩票的概率是1/n.从期望的角度来说我们需要买n张,才能买到。同理,当拥有一半种类的彩票时,再买一张彩票不重复的概率是(n/2)/n,即1/2,也就说买2张,就会再得到一种不重复的。因此如果一种彩票也没有时,只需买1张,即n/n,如果有了5张,那么买n/(n-5)张就可再买到一张不重复的,如果我们已经集了n-1种,我们需要再买n张,才能期望得到最后一种彩票,所以需要买的彩票总数为n/n + n/n-1 + n/n-2 +...+ n/2 + n/1;即n*(1/n + 1/n-1 +...+ 1/2 +1/1)。需要通分。注意64位__int64。

#include<iostream>
using namespace std;

__int64 gcd(__int64 a,__int64 b)
{
	return b?gcd(b,a%b):a;
}

__int64 lcm(__int64 a,__int64 b)
{
	return a/gcd(a,b)*b;
}

int numlen(__int64 n)
{
	int len=0;

	while(n)
	{
		n/=10;
		len++;
	}
	return len;
}

int main()      
{
	__int64 s,m,g,d;
	int l1,l2,i,n;

	while(scanf("%I64d",&n)==1)
	{
		m=1;   //分母
		s=0;   //分子
		for(i=1;i<=n;i++)
			m=lcm(m,i);
		for(i=1;i<=n;i++)
			s+=m/i;
		s*=n;
		g=gcd(m,s);   //求最大公约数
		s/=g;
		m/=g;
		d=s/m;       //整数部分
		s%=m;
		if(s==0)
		{
			printf("%d\n",d);
			continue;
		}
		l1=numlen(d);
		l2=numlen(m);
		for(i=0;i<=l1;i++)
			putchar(' ');
		printf("%I64d\n",s);
		printf("%I64d ",d);
		for(i=1;i<=l2;i++)
			putchar('-');
		putchar('\n');
		for(i=0;i<=l1;i++)
			putchar(' ');
		printf("%I64d\n",m);
	}
    return 0;      
}


HDU ACM 1099 Lottery

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/46349235

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!