hdu 1568 Fibonacci

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1568

参考别人的思路过的==|||,当n比较大的时候,使用如图所示的通项公式:

先化简,使用极限考虑,n很大的情况消去一个项:[1-(1-?5)^n/(1+?5)^n],然后方程两边取对数。

得到log10(fn) = n*log10((1+?5)/2)-1/2*log10(5)

ac代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int a[100];
void init(){
	a[0]=0;
	a[1]=1;
    for(int i=2;i<21;i++){
    	a[i]=a[i-1]+a[i-2];
    }
}

int main(){
	init();
	int n;
	while(scanf("%d",&n)==1){
		if(n<21){
			printf("%d\n",a[n]);
			continue;
		}
		double log10f = n*log((1+sqrt(5))/2)/log(10)-0.5*log(5)/log(10);
		double res = pow(10,log10f-floor(log10f));
		while(res<1000){
			res*=10;
		}
		printf("%d\n",(int)res);
	}
}

 

posted @ 2015-06-03 14:35  湖心北斗  阅读(134)  评论(0编辑  收藏  举报