百事世界杯之旅
百事世界杯之旅
设当前已经拥有 \(k\) 个瓶盖,\(p=k/n\) ,
则还需 \(t\) 次才能得到一个新瓶盖的概率为 \((1-p)^{t-1}p\)
$\therefore E=1+\sum\limits_{k=1}^{n-1} \sum\limits{+\infty}_{t=1}(1-\frac{k}{n})(\frac{k}{n})\times t $
\(=1+\sum\limits_{k=1}^{n-1}(1-\frac{k}{n})\sum^{+\infty}_{t=1}(\frac{k}{n})^{t-1}\times t\)
设
\(S_m=\sum\limits_{t=1}^m(\frac{k}{n})^{t-1}\times t\)
\(\therefore S_m=1+2(\frac{k}{n})+3(\frac{k}{n})^2+4(\frac{k}{n})^3+5(\frac{k}{n})^4+...+m(\frac{k}{n})^{m-1}\)
$\therefore (\frac{k}{n})S_m=(\frac{k}{n})+2(\frac{k}{n})2+3(\frac{k}{n})3+4(\frac{k}{n})4+...+(m-1)(\frac{k}{n})+m(\frac{k}{n})^m $
$ \therefore (1-\frac{k}{n})S_m=[1+\frac{k}{n}+(\frac{k}{n})2+(\frac{k}{n})3+...+(\frac{k}{n}){m-1}]-m(\frac{k}{n})m $
\(=\frac{1-(\frac{k}{n})^m}{1-\frac{k}{n}}-m(\frac{k}{n})^m\)
\(=\frac{n}{n-k}-(\frac{n}{n-k}+m)(\frac{k}{n})^m\)
\(\therefore S_m=(\frac{n}{n-k})^2-\frac{n}{n-k}\times \frac{m+\frac{n}{n-k}}{(\frac{n}{k})^m}\)
\(\lim\limits_{m\rightarrow+\infty}S_m=(\frac{n}{n-k})^2-\frac{n}{n-k}\times \frac{1}{(\frac{n}{k})^m\times ln(\frac{n}{k})}=(\frac{n}{n-k})^2\)
\(\therefore \sum\limits_{k=1}^{+\infty}(\frac{k}{n})^{t-1}\times t = (\frac{n}{n-k})^2\)
\(E=1+\sum\limits_{k=1}^{n-1}(\frac{n-k}{n}\times \frac{n}{n-k}\times \frac{n}{n-k})\)
\(=1+\sum\limits_{k=1}^{n-1}\frac{n}{n-k}\)
\(=\sum\limits_{k=0}^{n-1}\frac{n}{n-k}\)
\(=n\times \sum\limits_{k=0}^{n-1}\frac{1}{n-k}\)
因此,
\(E=n\sum\limits_{k=0}^{n-1}\frac{1}{n-k}\)
吐槽:201908012032在学高数先修课时发现博客园的 Markdown 支持分数了!真欢其!赶紧把推理过程从洛谷移过来。
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return !b?a:gcd(b,a % b);
}
struct Frac
{
ll a,b,z;
Frac(ll A=0,ll B=1):a(A),b(B){}
Frac operator + (const Frac& x)
const{
ll C=b*x.b,D=a*x.b+x.a*b;
ll g=gcd(max(C,D),min(C,D));
return Frac(D/g,C/g);
}
};
inline int Len(ll x)
{
if(x==0)return 0;
int l=0;
while(x)
{
l++;
x/=10;
}
return l;
}
int main()
{
ll n;
cin>>n;
Frac E(0,1);
for(int i=1;i<=n;i++)E=E+Frac(n,(ll)i);
if(E.b==1LL)cout << E.a;
else
{
ll C=E.a/E.b,A=E.a%E.b,B=E.b;
int l1=Len(C),l2=Len(B);
for(int i=1;i<=l1;i++)cout << " ";
cout << A << endl;
if(C != 0)cout << C;
for(int i=1;i<=l2;i++)cout << '-';
cout << endl;
for(int i=1;i<=l1;i++)cout << " ";
cout << B;
//当 C=0 时的情况。
}
return 0;
}