hiho 挑战赛11(随机斐波那契-算期望找规律)

题目1 : 随机斐波那契

时间限制: 5000ms
单点时限: 1000ms
内存限制: 256MB

描述

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

a= 1, a= 1, a= ai-1 + ai-2,(i > 1)。

现在考虑如下生成的斐波那契数列:

a= 1, a= a+ 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

由期望公式

直接把第i个数期望算出来,递推

PS:易证E[i]=i+1


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (500+10)
#define MAXn (500)
typedef long long ll;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return (a-b+(a-b)/F*F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
double E[MAXN];
int main()
{
//	freopen("fib.in","r",stdin);
//	freopen(".out","w",stdout);
	
	E[0]=1;
	E[1]=2;
	
	double s=E[0]+E[1];
	Fork(i,2,MAXn)
	{
		E[i]=s/(double)i*2;
		
		s+=E[i];	
				
	}
	int n;
	while(cin>>n) cout<<E[n]<<endl;
	return 0;
}






你可能感兴趣的:(hiho 挑战赛11(随机斐波那契-算期望找规律))