zoukankan      html  css  js  c++  java
  • [HDU3117]Fibonacci Numbers

    题目: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;
    }
            
  • 相关阅读:
    python基础之列表的坑
    python基础之字典篇
    坦克大战[源码] 你懂得
    java例程练习(键盘事件)
    android基础(对话框风格Activity实现)
    android基础(Activity)
    android基础(开发环境搭建)
    android基础(android程序的后台运行问题)
    java(敲 七)
    java例程练习(匿名类用法)
  • 原文地址:https://www.cnblogs.com/hjj1871984569/p/10060243.html
Copyright © 2011-2022 走看看