Lynstery大佬说这是傻逼题……
首先考虑斐波那契的通项公式:
Fn=15√⎡⎣(1+5√2)n−(1−5√2)n⎤⎦=15√(1+5√2)n⎡⎣1−(1−5√1+5√)n⎤⎦log10(Fn)=log10(15√)+n⋅log10(1+5√2)+log10⎡⎣1−(1−5√1+5√)n⎤⎦
然后当n很大时,最后一项可以忽略不计
所以就很好做了:
考虑将
Fn
表示成科学计数法:
Fn=1.balabala×10klog10(Fn)=log10(1.balabala)+k
此时做法已经很显然了:先得到 1.balabala=10log10(Fn)−⌊log10(Fn)⌋
然后一直乘以10,直到得到四位数
注:当n很小时,不太精确,所以要预处理前20个
示例程序:
#include<cstdio>
#include<cmath>
typedef long long LL;
const double s=1.6180339887498948482045868343656;
int n;
LL f[25];
int main(){
f[0]=0;f[1]=1;
for (int i=2;i<=20;i++) f[i]=f[i-1]+f[i-2];
while (~scanf("%d",&n)){
if (n<=20) {printf("%d\n",f[n]);continue;}
double ans=-0.5*log10(5)+n*log10(s);
ans-=(int)ans;
ans=pow(10,ans);
while (ans<1000) ans*=10;
printf("%d\n",(int)ans);
}
return 0;
}