题目:Fibonacci Numbers
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117
分析:
1)后四位可以用矩阵快速幂解决。$T= left[ egin{array}{cc} 0 & 1 \ 1 & 1 end{array} ight] $
2)前四位:Fibonacci公式:$ans= frac{1}{sqrt{5}} * { ( {frac{1+sqrt{5}}{2}}^n - {frac{1-sqrt{5}}{2}}^n )}$
当n够大时,${( frac{1-sqrt{5}}{2} )}^n$趋于0。
取以10为底的对数:
$log_{10}{ans} = log_{10}{frac{1}{sqrt{5}} * {[ {frac{1+sqrt{5}}{2}}^n - {frac{1-sqrt{5}}{2}}^n ]}}$
$= log_{10}{frac{1}{sqrt{5}} * {[ frac{1+sqrt{5}}{2} ]}^n }$
$= log_{10}{frac{1}{sqrt{5}} + log_{10}{frac{1+sqrt{5}}{2}}^n}$
$= -0.5*log_{10}{5} + n*log_{10}{[ frac{1+sqrt{5}}{2} ]}$
然后
$10^{ans} \% 10000$=$10^{[ans]} * 1000$=$10^{3+ans-(long long)ans}$
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; typedef long long LL; const int MOD=100000000; struct Matrix{ LL a[2][2]; void init(int f){ memset(a,0,sizeof a); if(f==-1)return; for(int i=0;i<2;++i)a[i][i]=1; } }; Matrix operator*(Matrix& A,Matrix& B){ Matrix C;C.init(-1); for(int i=0;i<2;++i) for(int j=0;j<2;++j) for(int k=0;k<2;++k){ C.a[i][j]+=A.a[i][k]*B.a[k][j]; C.a[i][j]%=MOD; } return C; } Matrix operator^(Matrix A,int n){ Matrix Rt;Rt.init(0); for(;n;n>>=1){ if(n&1)Rt=Rt*A; A=A*A; } return Rt; } int main(){ Matrix A,T; T.a[0][0]=0;T.a[0][1]=1; T.a[1][0]=1;T.a[1][1]=1; for(int n;~scanf("%d",&n);){ if(n<40){ A=T^n; printf("%lld ",A.a[1][0]); }else{ A=T^n; double ans=-0.5*log10(5.0)+n*log10((1+sqrt(5.0))/2); ans=ans-(LL)ans+3; printf("%d...%04lld ",(int)pow(10,ans),A.a[1][0]%10000); } } return 0; }