题意:有一种盒子,盒子一面会随机放一种卡片,现在要集齐n种卡片,问要买多少个盒子。
题解:假如说n==2,那么第一次买,肯定可以得到一种新的卡片,第二次买得到新的卡片的概率是1/2,也就是说你那买2包才能得到新的卡片,所以期望值是1+2==3;如果n==3的话,第一次概率是1,第二次是2/3,也就是说第二次要买3/2包才能得到一种新的卡片,第三次是1/3,所以要买3包,所以总的期望是1+3/2+3;一次类推,可以得到期望:n/1+n/2+n/3+.....+n/n.还有题目中的输出格式,用log(a)/log(10)+1就可以得到a的位数。还有uva用的是lld,不是I64d
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<set> 6 #include<cmath> 7 using namespace std; 8 long long n,temp,a,b,ans; 9 long long gcd(long long a, long long b){ 10 if(b==0) 11 return a; 12 return gcd(b,a%b); 13 } 14 15 int main(){ 16 while(~scanf("%lld",&n)){ 17 a=1;b=1;ans=0; 18 for(int i=2;i<=n;i++){ 19 a=a*i+b; 20 b=b*i; 21 temp=gcd(a,b); 22 a/=temp; 23 b/=temp; 24 } 25 a*=n; 26 temp=gcd(a,b); 27 a/=temp; 28 b/=temp; 29 ans=a/b; 30 a=a%b; 31 temp=gcd(a,b); 32 a/=temp; 33 b/=temp; 34 int m,t; 35 int s=(int)(log(b)/log(10)+1); 36 m=t=(int)(log(ans)/log(10)+2); 37 if(a==0) 38 printf("%lld ",ans); 39 else{ 40 while(t--)printf(" "); 41 printf("%lld ",a); 42 printf("%lld ",ans); 43 while(s--)printf("-"); 44 printf(" "); 45 while(m--)printf(" "); 46 printf("%lld ",b); 47 } 48 49 } 50 }