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

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1242

    题目:

    斐波那契数列的定义如下:
     
    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的结果即可。
     
    Input
    输入1个数n(1 <= n <= 10^18)。
    Output
    输出F(n) % 1000000009的结果。
    Input示例
    11
    Output示例
    89


    分析:n那么大,普通的循坏求解肯定超时,所以就要用矩阵快速幂求解!!!http://www.cnblogs.com/vongang/archive/2012/04/01/2429015.html

    AC代码
    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    using namespace std;
    typedef long long ll;
    #define MOD 1000000009
    
    struct Mat   //矩阵
    {
       ll mat[2][2];
    }t;
    
    Mat mat_x(Mat a,Mat b) //矩阵乘法
    {
        Mat ta;
        memset(ta.mat,0,sizeof(ta.mat));
        for (int i=0;i<2;i++)
            for (int j=0;j<2;j++)
        {
               for (int k=0;k<2;k++)
             ta.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%MOD;
              ta.mat[i][j] = ta.mat[i][j]%MOD;
        }
    
             return ta;
    }
    
    Mat mat_ksm(ll w)
    {
        Mat temp=t;
         if(w<0)
            return temp;
        while (w)
        {
            if (w&1)
               temp=mat_x(temp,t);
            t=mat_x(t,t);
            w=w>>1;
        }
        return temp;
    }
    
    void init()
    {
        t.mat[0][0]=1;
        t.mat[0][1]=1;
        t.mat[1][0]=1;
        t.mat[1][1]=0;
    }
    
    int main()
    {
        ll n;
        ios::sync_with_stdio(false);
        cin>>n;
        init();
        Mat tt=mat_ksm(n-2);
        cout << tt.mat[0][0] << endl;
        return 0;
    }

     

  • 相关阅读:
    botzone Tetris2
    NOIP2017游记
    城乡联谊胡策会糊厕R3
    SRM 20
    AtCoder Regular Contest 082
    AtCoder Grand Contest 019
    复数模版
    SRM13
    NOI2017&&codeM2017游记
    java多线程编程
  • 原文地址:https://www.cnblogs.com/lisijie/p/7668363.html
Copyright © 2011-2022 走看看