200_Fibonacci

来源:互联网 发布:js获取索引值 编辑:程序博客网 时间:2024/06/12 01:06

Fibonacci数列,使用矩阵来实现,计算A^n 使用递归,复杂度为O(logn)。


题源来自《挑战程序竞赛》第二版 200页

////  200_Fibonacci.cpp//  changlle////  Created by user on 1/28/16.//  Copyright (c) 2016 user. All rights reserved.//#include <iostream>#include <vector>using namespace std;typedef vector<int>  vec;typedef vector<vec> mat;typedef long long ll;const int M=10000;ll n;//计算A*Bmat mul (mat &A, mat &B){    mat C(A.size(), vec(B[0].size()));          for (int i=0;i<A.size();i++)              for (int k=0;k<B.size();k++)                  for (int j=0;j<B[0].size();j++)                      C[i][j]=(C[i][j]+A[i][k]*B[k][j])%M;    return C;          }//计算A^nmat pow(mat A,ll n){    mat B(A.size(),vec(A.size()));        for (int i=0;i<A.size();i++) {        B[i][i]=1;    }        while(n>0) {        if (n &1) B=mul(B,A);        A=mul(A,A);        n>>=1;//向右移动一位,并且返回值给n;    }    return B;}void solve() {    mat A(2,vec(2));    A[0][0]=1; A[0][1]=1;    A[1][0]=1;A[1][1]=0; //注意矩阵的可读性    A=pow(A,n);    cout<<A[1][0]<<endl;    }int main() {        n=4;    solve();}


1 0
原创粉丝点击