[HDU3117]Fibonacci Numbers

题目:Fibonacci Numbers

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3117

分析:

1)后四位可以用矩阵快速幂解决。$T= \left[ \begin{array}{cc} 0 & 1 \\ 1 & 1 \end{array} \right] $

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\n",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\n",(int)pow(10,ans),A.a[1][0]%10000);
        }
    }
    return 0;
}
        

 

posted @ 2018-12-03 19:10  hjj1871984569  阅读(148)  评论(0编辑  收藏  举报