描述
大家对斐波那契数列想必都很熟悉:
a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1)。
现在考虑如下生成的斐波那契数列:
a0 = 1, ai = aj + ak, i > 0, j, k从[0, i-1]的整数中随机选出(j和k独立)。
现在给定n,要求求出E(an),即各种可能的a数列中an的期望值。
输入
一行一个整数n,表示第n项。(1<=n<=500)
输出
一行一个实数,表示答案。你的输出和答案的绝对或者相对误差小于10-6时被视为正确答案。
样例解释
共存在3种可能的数列
1,2,2 1/4
1,2,3 1/2
1,2,4 1/4
所以期望为3。
样例输入
2
样例输出
3.000000 f[i]=∑∑f[i]+f[j]倒腾一下f[i]=(∑f[j]*2*i)/(i*i)
#include<cstdio> #include<cctype> #include<queue> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define ren for(int i=first[x];i!=-1;i=next[i]) using namespace std; inline int read() { int x=0,f=1;char c=getchar(); for(;!isdigit(c);c=getchar()) if(c==‘-‘) f=-1; for(;isdigit(c);c=getchar()) x=x*10+c-‘0‘; return x*f; } const int maxn=510; double A[maxn],S[maxn]; int main() { A[0]=S[0]=1.0; int n=read(); rep(i,1,n) { A[i]=(2*i*S[i-1])/(i*i); S[i]=S[i-1]+A[i]; //printf("%.6lf\n",A[i]); } printf("%.8lf\n",A[n]); return 0; }
发现结果是n+1。
归纳证明E(a_n)=n+1 对于E(a_0)和E(a_1)显然成立 设对于k<=n都成立, 由期望的可加性 E(a_n+1)=E(a_i+a_j)=E(a_i)+E(a_j)=2*(1+2+3+...+n+1)/(n+1)=n+2
时间: 2024-10-30 07:44:11