题目描述

北雷老中医不懂 Fibonacci,于是他定义了一种名叫Feibonaqi的数列,数列满足以下要求:
1.f(0)=0,f(1)=1
2.f(n)=2f(n-1)+f(n-2),n>1
那么问题来了,这个数列的第n项是多少呢?
(不为难大家用高精度了,你只需要将结果对1,000,000,007取模后输出即可)

 

输入

多组数据
每组数据一行,包含一个整数n,1<n<1,000,000,000

 

输出

每组数据输出一个整数,即为f(n)对1,000,000,007取模后的结果

--正文
矩阵快速幂
怎么求基础的矩阵就是使用线代的知识了(反正我是照着课本按图索骥的)
话说怎么又是1000000007..
#include <stdio.h>
#include <math.h>
#define MOD 1000000007 

typedef struct {
    long M[2][2];
} Matrix;

Matrix Ans,Base;
long n;

Matrix multi(Matrix a,Matrix b){
    Matrix Tmp;
    int i,j,k;
    for (i=0;i<2;i++){
        for (j=0;j<2;j++){
            Tmp.M[i][j] = 0;
            for (k=0;k<2;k++){
                Tmp.M[i][j] = ( Tmp.M[i][j] + a.M[i][k] * b.M[k][j]) % MOD; 
            }
        }
    }
    return Tmp;
}

long Fast_Mod(long n){
    Base.M[0][0] = 2; Base.M[0][1] = 1;
    Base.M[1][0] = 1; Base.M[1][1] = 0;
    Ans.M[0][0] = 1; Ans.M[0][1] = 0;
    Ans.M[1][0] = 0; Ans.M[1][1] = 1;
    while (n) {
        if (n & 1){
            Ans = multi(Ans,Base);
        }
        Base = multi(Base,Base);
        n = n >> 1;
    } 
    return Ans.M[0][1];
}


int main(){
    while (scanf("%ld",&n) != EOF){
        printf("%ld\n",Fast_Mod(n)); 
    } 
    return 0;
    
} 

 

posted on 2016-11-15 14:07  Crutain  阅读(356)  评论(0)    收藏  举报