题目链接: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#include #include 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); }}