Fibonacci

题意:

求解斐波那契数列第$n$项的前4位数字。

解法:

注意到只需要求解前几位数字,这样只要求出$log_{10}{ans}$而后取小数部分$x$,再求出$[10^x * 1000]$即可。

关键在于求解$log_{10}{F_n}$:

1.由数列特征根得

$F_n = frac{1}{ sqrt{5} } ( {x_1}^n - {x_2}^n ) $

$x_1,x_2$为方程$x^2 = x+1$的解,假定$x_1$为较大的解。

注意到${x_2}^n$是收敛的,这样可以直接计算出其值,而对于${x_1}^n$则难以计算。

这样对原式化简得

$F_n = frac{1}{sqrt{5}} {x_1}^n (1 - (frac{x_2}{x_1})^n )$

左右取$log_{10}$即可。

2.由极限分析得,$lim_{x o infty}{ frac{F_{n+1}}{F_n} } = phi$

从而有$F_n approx F_t * {phi}^{n-t}$

左右取$log_{10}$即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 
 6 #define LD long double
 7 
 8 using namespace std;
 9 
10 LD qpow(LD x,int n)
11 {
12     LD ans=1;
13     for(;n;n>>=1,x*=x)
14         if(n&1) ans*=x;
15     return ans;
16 }
17 
18 int n;
19 
20 int main()
21 {
22     while(~scanf("%d",&n))
23     {
24         if(n==0)
25         {
26             puts("0");
27             continue;
28         }
29         LD rt5 = sqrt(5);
30         LD log_Fn = -log10(rt5) + n*(LD)log10((rt5+1)/2);
31         log_Fn += log10(1 - qpow((1-rt5)/(rt5+1),n));
32         LD tmp = (double)pow(10,log_Fn);
33         if(tmp <= 10000.0)
34         {
35             cout << (int)tmp << endl;
36             continue;
37         }
38         log_Fn -= floor(log_Fn);
39         cout << (int)(pow(10,log_Fn)*1000.0) << endl;
40     }
41     return 0;
42 }
View Code
原文地址:https://www.cnblogs.com/lawyer/p/6575239.html