#1164 : 随机斐波那契

描述

大家对斐波那契数列想必都很熟悉:

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
",A[i]);
    }
    printf("%.8lf
",A[n]);
    return 0;
}
View Code

发现结果是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
原文地址:https://www.cnblogs.com/wzj-is-a-juruo/p/4802914.html