题意: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