题意: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;
}
原文地址:http://blog.csdn.net/a809146548/article/details/46349235