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 \to \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 }