思路:主要就是两点:
1)Fibonacci的通项表达式
F(n)=1/sqrt(5)*[((1+sqrt(5))/2)^n-((1-sqrt(5))/2)^n]
2)用对数处理通项
#include<bits/stdc++.h>
using namespace std;
int n;
int F[21];
void init(){
F[0]=0;
F[1]=1;
for(int i=2;i<21;i++){
F[i]=F[i-1]+F[i-2];
}
}
void solve(){
if(n<21){
cout<<F[n]<<endl;
return;
}
//n比较大,第二项可省略,对n比较小打表,避免精度问题
double x=n*log10((1+sqrt(5))/2)-log10(sqrt(5));
int y=x;
x-=y;
x=pow(10,x);
cout<<(int)(x*1000)<<endl;
}
int main(){
//freopen("in.txt","r",stdin);
init();
while(cin>>n){
solve();
}
return 0;
}