zoukankan      html  css  js  c++  java
  • 51Nod 1242 斐波那契数列的第N项

    斐波那契数列的定义如下:

    F(0) = 0

    F(1) = 1

    F(n) = F(n - 1) + F(n - 2) (n >= 2)

    (1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)

    给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。

    收起

    输入

    输入1个数n(1 <= n <= 10^18)。

    输出

    输出F(n) % 1000000009的结果。

    输入样例

    11

    输出样例

    89
     
    代码如下:
    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <string>
    #include <cmath>
    #include <algorithm>
    typedef long long ll;
    using namespace std;
    const ll MOD=1e9+9;
    //定义一个结构体,存放矩阵,方便调用
    struct matrix{
        ll m[2][2];
    }; 
    //矩阵相乘
    matrix mat_multi(matrix a,matrix b){
        matrix c;
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                c.m[i][j]=0;
                for(int k=0;k<2;k++){
                    c.m[i][j]+=(a.m[i][k]%MOD*b.m[k][j]%MOD)%MOD;
                    c.m[i][j]%=MOD;
                }
            } 
        }
        return c; 
    } 
    //矩阵快速幂
    matrix mat_quickpow(matrix a,ll n){
        matrix ans;
        for(int i=0;i<2;i++){
            for(int j=0;j<2;j++){
                if(i==j) ans.m[i][j]=1;
                else ans.m[i][j]=0;
            }
        }
        while(n){
            if(n%2==1) ans=mat_multi(ans,a);
            a=mat_multi(a,a);
            n/=2;
        }
        return ans;
    } 
    int main(){
        ll n;
        matrix a,ans;
        a.m[0][0]=1;
        a.m[0][1]=1;
        a.m[1][0]=1;
        a.m[1][1]=0;
        scanf("%lld",&n);
        ans=mat_quickpow(a,n);
        printf("%lld
    ",ans.m[0][1]);
        return 0;
    }
    天晴了,起飞吧
  • 相关阅读:
    商城项目开发(一)
    java基础
    SpringBoot笔记
    设计模式-创建型模式
    讲真的 曾惜
    Linux常用精简命令实训练习
    使用ZeroClipboard.js复制内容到剪贴板上
    浅谈Jquery中的bind(),live(),delegate(),on()绑定事件方式
    jQuery mouseover与mouseenter,mouseout与mouseleave的区别
    div中的img垂直居中
  • 原文地址:https://www.cnblogs.com/jianqiao123/p/11354867.html
Copyright © 2011-2022 走看看